Javascript 迭代对象的值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33946567/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 15:41:52  来源:igfitidea点击:

Iterate over values of object

javascriptdictionary

提问by Matthias M

I want to iterate over all values of a map. I know it's possible to iterate over all keys. But is it possible to iterate directly over the values?

我想遍历地图的所有值。我知道可以遍历所有键。但是是否可以直接迭代这些值?

 var map = { key1 : 'value1', key2 : 'value2' }
 for (var key in map) { ...} // iterates over keys

回答by André Chalella

It's not a map. It's simply an Object.

这不是地图。它只是一个Object.

Edit:below code is worse than OP's, as Amit pointed out in comments.

编辑:正如 Amit 在评论中指出的那样,下面的代码比 OP 更糟糕。

You can "iterate over the values" by actually iterating over the keyswith:

您可以通过实际迭代来“迭代值” :

var value;
Object.keys(map).forEach(function(key) {
    value = map[key];
    console.log(value);
});

回答by Parag Jadhav

I iterate like this and it works for me.

我像这样迭代,它对我有用。

for (let [k, v] of myMap) {
    console.log("Key: " + k);
    console.log("Value: " + v);
}

Hope this helps :)

希望这可以帮助 :)

回答by Ben Aston

In the sense I think you intended, in ES5 or ES2015, no, not without some work on your part.

从某种意义上说,我认为在 ES5 或 ES2015 中,不,不是没有你的一些工作。

In ES2016, probably with object.values.

在 ES2016 中,可能使用object.values.

Mind you Arrays in JavaScript are effectively a map from an integer to a value, and the values in JavaScript arrays can be enumerated directly.

请注意 JavaScript 中的数组实际上是从整数到值的映射,并且可以直接枚举 JavaScript 数组中的值。

['foo', 'bar'].forEach(v => console.log(v)); // foo bar

Also, in ES2015, you can make an object iterable by placing a function on a property with the name of Symbol.iterator:

此外,在 ES2015 中,您可以通过将函数放置在名称为 的属性上来使对象可迭代Symbol.iterator

var obj = { 
    foo: '1', 
    bar: '2',
    bam: '3',
    bat: '4',
};

obj[Symbol.iterator] = iter.bind(null, obj);

function* iter(o) {
    var keys = Object.keys(o);
    for (var i=0; i<keys.length; i++) {
        yield o[keys[i]];
    }
}

for(var v of obj) { console.log(v); } // '1', '2', '3', '4'

Also, per other answers, there are other built-ins that provide the functionality you want, like Map(but notWeakMapbecause it is not iterable) and Setfor example (but these are not present in all browsers yet).

此外,根据其他答案,还有其他内置程序可以提供您想要的功能,例如Map(但不是WeakMap因为它不可迭代)和Set例如(但这些尚未出现在所有浏览器中)。

回答by dmigo

EcmaScript 2017 introduced Object.entriesthat allows you to iterate over values and keys. Documentation

引入的 EcmaScript 2017Object.entries允许您迭代值和键。文档

var map = { key1 : 'value1', key2 : 'value2' }

for (let [key, value] of Object.entries(map)) {
    console.log(`${key}: ${value}`);
}

The result will be:

结果将是:

key1: value1
key2: value2

键 1
:值1 键2:值 2

回答by Menelaos Kotsollaris

In case you want to deeply iterateinto a complex (nested) object for each key & value, you can do so using Object.keys():

如果您想为每个key & value深度迭代到一个复杂的(嵌套)对象,您可以使用Object.keys()

const iterate = (obj) => {
    Object.keys(obj).forEach(key => {

    console.log(`key: ${key}, value: ${obj[key]}`)

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
        }
    })
}

回答by Amit

No, there's no direct method to do that with objects.

不,没有直接的方法可以对对象执行此操作。

The Maptype does have a values()method that returns an iterator for the values

Map类型确实有一个values()返回值的迭代器的方法

回答by dpr

You could use underscore.js and the each function:

您可以使用underscore.js 和 each 函数

_.each({key1: "value1", key2: "value2"}, function(value) {
  console.log(value);
});