Как выполнить итерацию (ключи, значения) в JavaScript?

У меня есть словарь в формате

dictionary = {0: {object}, 1:{object}, 2:{object}}

Как я могу перебирать этот словарь, делая что-то вроде

for ((key, value) in dictionary) {
    //Do stuff where key would be 0 and value would be the object
}

person nbroeking    schedule 21.01.2016    source источник
comment
for (let [key, value] of Object.entries(obj)), нужен Вавилон.   -  person elclanrs    schedule 21.01.2016
comment
возможный дубликат   -  person Tholle    schedule 21.01.2016
comment
@elclanrs Он есть в ES2016 и еще не стандартизирован :-)   -  person thefourtheye    schedule 21.01.2016
comment
Возможный дубликат для каждого по массиву в JavaScript?   -  person sdc    schedule 21.01.2016
comment
@dooagain, это не массив в этом вопросе.   -  person zangw    schedule 21.01.2016
comment
Возможный дубликат Как перебирать объект ключ / значение в Javascript?   -  person iammilind    schedule 17.09.2018


Ответы (11)


tl;dr

  1. В ECMAScript 2017 просто вызовите Object.entries(yourObj).
  2. В ECMAScript 2015 это возможно с Maps.
  3. В ECMAScript 5 это невозможно.

ECMAScript 2017

В ECMAScript 2017 появилась новая функция Object.entries . Вы можете использовать это для итерации объекта по своему усмотрению.

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};

for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

Выход

a 1
b 2
c 3

ECMAScript 2015

В ECMAScript 2015 нет Object.entries, но вместо этого вы можете использовать Map объекты и перебирать их с помощью _ 8_. Цитируя пример с этой страницы,

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]

Или выполните итерацию с помощью for..of, как это

'use strict';

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap.entries()) {
  console.log(entry);
}

Выход

[ '0', 'foo' ]
[ 1, 'bar' ]
[ {}, 'baz' ]

Or

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

Выход

0 foo
1 bar
{} baz

ECMAScript 5:

Нет, с объектами это невозможно.

Вам следует выполнить итерацию с помощью _15 _ или Object.keys, как это

for (var key in dictionary) {
    // check if the property/key is defined in the object itself, not in parent
    if (dictionary.hasOwnProperty(key)) {           
        console.log(key, dictionary[key]);
    }
}

Примечание. Вышеупомянутое if условие необходимо только в том случае, если вы хотите перебирать свойства, которые являются собственными dictionary объектами. Потому что for..in будет перебирать все унаследованные перечислимые свойства.

Or

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});
person thefourtheye    schedule 21.01.2016
comment
Основное сомнение здесь. Я приземлился здесь, чтобы узнать, как это сделать в node.js, который является javascript на стороне сервера. Как узнать, какая версия ES применима в моем случае. Кроме того, в случае обычных пользователей javascript, как правильно поддерживать, насколько я понимаю, версия ES зависит от браузера клиента? - person Sandeepan Nath; 28.08.2018
comment
@SandeepanNath. Вы можете использовать такие веб-сайты, как node.green, чтобы узнать, поддерживается ли конкретная функция ES в вашем Node.js. Что касается браузеров, люди обычно ориентируются на широко поддерживаемую версию, в данном случае на ES5. Помимо этого, транспилеры (например, Babel) помогают конвертировать код ES2015 + в ES5. - person thefourtheye; 29.08.2018
comment
Мне нравится Object.keys(dictionary).forEach(function(key) {… очень читабельный и совместимый. - person ctrl-alt-delor; 28.12.2018
comment
Решение ECMAScript 2015, приведенное выше, вызвало TypeScript и Iterator: Type 'IterableIterator ‹T› '- это не тип массива, а простой ol myMap (). foreach () работал хорошо. - person ttugates; 10.04.2019
comment
Чтобы избежать чрезмерного отступа, было бы лучше написать для (ключ var в словаре) {if (! Parameters.hasOwnProperty (key)) {continue;} console.log (key, dictionary [key]);} - person kloddant; 10.10.2019

Попробуй это:

dict = {0:{1:'a'}, 1:{2:'b'}, 2:{3:'c'}}
for (var key in dict){
  console.log( key, dict[key] );
}

0 Object { 1="a"}
1 Object { 2="b"}
2 Object { 3="c"}
person alex10    schedule 21.01.2016
comment
Это должен быть принятый ответ. Принял ответ так долго. - person coolcool1994; 21.10.2020

Метод Object.entries() был указан в ES2017 (и поддерживается во всех современных браузерах):

for (const [ key, value ] of Object.entries(dictionary)) {
    // do something with `key` and `value`
}

Объяснение:

  • Object.entries() принимает такой объект, как { a: 1, b: 2, c: 3 }, и превращает его в массив пар ключ-значение: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • С помощью for ... of мы можем перебирать записи созданного таким образом массива.

  • Поскольку мы гарантированно, что каждый из повторяемых элементов массива сам по себе является массивом с двумя записями, мы можем использовать destructuring для прямого присвоения переменных key и value его первому и второму элементу.

person Loilo    schedule 17.08.2017

ДОБРО ПОЖАЛОВАТЬ В 2020 * Drools в ES6 *

Здесь есть несколько довольно старых ответов - воспользуйтесь деструктуризацией. На мой взгляд, это, без сомнения, самый приятный (очень читаемый) способ итерации объекта.

const myObject = {
    nick: 'cage',
    phil: 'murray',
};

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ", k)
    console.log("The value: ", v)
})

Изменить:

Как упоминал Lazerbeak, map позволяет вам циклически перемещать объект и использовать ключ и значение для создания массива.

const myObject = {
    nick: 'cage',
    phil: 'murray',
};

const myArray = Object.entries(myObject).map(([k, v]) => {
    return `The key '${k}' has a value of '${v}'`;
});

console.log(myArray);

Изменить 2:

Чтобы объяснить, что происходит в строке кода:

Object.entries(myObject).forEach(([k,v]) => {}

Object.entries() преобразует наш объект в массив массивов:

[["nick", "cage"], ["phil", "murray"]]

Затем мы используем forEach во внешнем массиве:

1st loop: ["nick", "cage"]
2nd loop: ["phil", "murray"]

Затем мы деструктурируем значение (которое, как мы знаем, всегда будет массивом) с помощью ([k,v]), так что k становится первым именем, а v становится фамилией.

person Steve    schedule 02.04.2020
comment
Просто примечание: если вы замените forEach на map выше, тогда можно будет агрегировать значения. map затем вернет список указанных значений, что потенциально может упростить код другими способами. - person Lazerbeak12345; 08.06.2020

Попробуй это:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}
person AMACB    schedule 21.01.2016

Вы можете сделать что-то вроде этого:

dictionary = {'ab': {object}, 'cd':{object}, 'ef':{object}}
var keys = Object.keys(dictionary);

for(var i = 0; i < keys.length;i++){
   //keys[i] for key
   //dictionary[keys[i]] for the value
}
person Dhaval Chaudhary    schedule 17.08.2017
comment
Красивый! Мне нравится, как ваш ответ работает в ECMAscript 5, несмотря на принятый и наиболее одобренный ответ, в котором говорится, что это невозможно. Вы заслуживаете гораздо больше голосов. - person lilHar; 31.01.2019

Я думаю, что самый простой и быстрый способ - это

Object.entries(event).forEach(k => {
    console.log("properties ... ", k[0], k[1]); });

просто проверьте документацию https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

person Jonathan    schedule 26.09.2018
comment
еще лучше: Object.entries (obj) .forEach (([ключ, значение]) = ›{console.log (${key} ${value});}); - person Hani; 22.11.2018

используя swagger-ui.js

ты можешь сделать это -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });
person deeshank    schedule 29.11.2017

Вы можете использовать нижеприведенный сценарий.

var obj={1:"a",2:"b",c:"3"};
for (var x=Object.keys(obj),i=0;i<x.length,key=x[i],value=obj[key];i++){
    console.log(key,value);
}

выходы
1 a
2 b
c 3

person Michael Piper    schedule 19.08.2019
comment
# выведет #c 3 # 1 a # 2 b - person Michael Piper; 19.08.2019
comment
Подумайте о добавлении объяснения к своему ответу, сам по себе код менее полезен. Кроме того, вы можете редактировать свой ответ, комментарии не предназначены для расширения ответа в том виде, в котором вы их используете. - person Viktor; 19.08.2019

В качестве улучшения принятого ответа, чтобы уменьшить вложенность, вы можете сделать это вместо этого, при условии, что ключ не унаследован:

for (var key in dictionary) {
    if (!dictionary.hasOwnProperty(key)) {
        continue;
    }
    console.log(key, dictionary[key]);
}

Изменить: информация о Object.hasOwnProperty здесь

person kloddant    schedule 21.12.2018

Вы можете использовать JavaScript forEach Loop:

myMap.forEach((value, key) => {
    console.log('value: ', value);
    console.log('key: ', key);
});
person Severin Toldo    schedule 11.01.2021
comment
Нет, не могут. myMap - простой объект, а не массив. - person Quentin; 11.01.2021
comment
это работает для меня, хотя plnkr.co/edit/9KaRqXWZ38NyVTs3?open=lib .js - person Severin Toldo; 12.01.2021
comment
Вы использовали объект Map вместо простого объекта, который использовался в вопросе. - person Quentin; 12.01.2021
comment
О, понятно, я столкнулся с этим вопросом, когда искал объект Map. Виноват. - person Severin Toldo; 13.01.2021
comment
@SeverinToldo, но он работает для карты, поддерживаемой es5 - person Parameshwar; 22.02.2021