Перебор значений объекта

Я хочу перебрать все значения карты. Я знаю, что возможно перебирать все ключи. Но возможно ли итерация непосредственно над значениями?

 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(), который возвращает итератор для значений

Ответ 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])
        }
    })
}