Javascript:迭代对象的值

Mat*_*s M 50 javascript dictionary

我想迭代地图的所有值.我知道可以迭代所有键.但是可以直接迭代值吗?

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

And*_*lla 51

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

编辑: 正如阿米特在评论中所指出的,下面的代码比OP更差.

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

var value;
Object.keys(map).forEach(function(key) {
    value = map[key];
    console.log(value);
});
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到这比OP的`for(var key in map){map [key]}`更好.它更长,更不易读,浪费内存,执行速度更慢 - 有什么理由这样做吗? (8认同)

Par*_*hav 12

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

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

希望这可以帮助 :)

  • 我创建 `var myMap = { key1 : 'value1', key2 : 'value2' }`,尝试使用您的代码并收到错误:`TypeError: myMap is not iterable`。对我来说唯一的方法是使用`Object.entries(myMap)`,如@dmigo所说。也许您以其他方式创建地图? (2认同)

Ben*_*Ben 9

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

在ES2016中,可能与object.values.

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

['foo', 'bar'].forEach(v => console.log(v)); // foo bar
Run Code Online (Sandbox Code Playgroud)

此外,在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'
Run Code Online (Sandbox Code Playgroud)

另外,根据其他答案,还有其他内置函数可以提供您想要的功能,例如Map(但不是 WeakMap因为它不可迭代),Set例如(但这些并不存在于所有浏览器中).


dmi*_*igo 7

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

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

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

结果将是:

键 1
:值1 键2:值 2