Перебор значений объекта
Я хочу перебрать все значения карты.
Я знаю, что возможно перебирать все ключи.
Но возможно ли итерация непосредственно над значениями?
var map = { key1 : 'value1', key2 : 'value2' }
for (var key in map) { ...} // iterates over keys
Ответы
Ответ 1
Это не карта. Это просто Object
.
Изменить: ниже код хуже, чем OP, как отметил Амит в комментариях.
Вы можете "перебирать значения", фактически итерации по клавишам:
var value;
Object.keys(map).forEach(function(key) {
value = map[key];
console.log(value);
});
Ответ 2
В том смысле, я думаю, вы намеревались в 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
для (но они отсутствуют во всех браузерах).
Ответ 3
Я использовал, чтобы повторить, как это. Не знаю, оптимизированный ли это код или нет, но он работает для меня.
for (let [k, v] of myMap) {
console.log("Key: " + k);
console.log("Value: " + v);
}
Надеюсь это поможет :)
Ответ 4
Нет, нет прямого метода для этого с объектами.
Map
имеет values()
, который возвращает итератор для значений
Ответ 5
Вы можете использовать underscore.js и каждую функцию:
_.each({key1: "value1", key2: "value2"}, function(value) {
console.log(value);
});
Ответ 6
Если вы хотите выполнить глубокую итерацию в сложный (вложенный) объект для каждого ключа и значения, вы можете сделать это с помощью 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])
}
})
}