我想迭代地图的所有值。 我知道iterate over all keys可以。 但是可以直接迭代值吗?
var map = { key1 : 'value1', key2 : 'value2' }
for (var key in map) { ...} // iterates over keys
答案 0 :(得分:48)
它不是地图。它只是一个Object
。
编辑: 以下代码比OP更糟糕,正如Amit在评论中指出的那样。
你可以"迭代价值"通过实际迭代键:
var value;
Object.keys(map).forEach(function(key) {
value = map[key];
console.log(value);
});
答案 1 :(得分:8)
从某种意义上来说,我认为你打算在ES5或ES2015中,不,不是没有你的工作。
在ES2016中,可能是object.values
。
请注意,JavaScript中的数组实际上是一个从整数到值的映射,JavaScript数组中的值可以直接枚举。
['foo', 'bar'].forEach(v => console.log(v)); // foo bar
此外,在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'
此外,根据其他答案,还有其他内置插件可提供您想要的功能,例如Map
(但不 WeakMap
,因为它不可迭代)例如Set
(但这些在所有浏览器中都不存在)。
答案 2 :(得分:5)
我以前经常这样迭代。不知道它是否是优化的代码,但对我有用。
for (let [k, v] of myMap) {
console.log("Key: " + k);
console.log("Value: " + v);
}
希望这会有所帮助:)
答案 3 :(得分:2)
EcmaScript 2017引入了Object.entries
,使您可以迭代值和键。 Documentation
var map = { key1 : 'value1', key2 : 'value2' }
for (let [key, value] of Object.entries(map)) {
console.log(`${key}: ${value}`);
}
结果将是:
key1:value1
key2:value2
答案 4 :(得分:1)
答案 5 :(得分:1)
遇到此问题的任何人,我都设法通过执行以下操作在 njs ( nginx js ) 中解决了此问题:
df=df.rename(columns={'id':'source_id'})
g_cols=['source_id','fn','ln','email','dob']
cols=df.columns[~df.columns.isin(g_cols)]
out=(df.groupby(g_cols)[cols]
.apply(lambda x:x.to_dict('records'))
.reset_index(name='address').to_dict('records'))
答案 6 :(得分:0)
您可以使用underscore.js and the each function:
_.each({key1: "value1", key2: "value2"}, function(value) {
console.log(value);
});
答案 7 :(得分:0)
如果要针对每个键和值 深度迭代到复杂的(嵌套的)对象中,可以使用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])
}
})
}