Як ітерацію (ключі, значення) в JavaScript?


335

У мене є словник у форматі

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
}

3
for (let [key, value] of Object.entries(obj)), потрібна Вавилон.
elclanrs


1
@elclanrs Його в ES2016, і він ще не стандартизований :-)
thefourtheye


@dooagain, це не масив у цьому питанні.
zangw

Відповіді:


479

тл; д-р

  1. У ECMAScript 5 це неможливо.
  2. У ECMAScript 2015 можливо з Maps.
  3. У ECMAScript 2017 він буде легко доступний.

ECMAScript 5:

Ні, це неможливо з об'єктами.

Ви повинні або повторити for..in, або 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це повторить усі спадкові перелічені властивості.

Або

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});

ECMAScript 2015

У ECMAScript 2015 ви можете використовувати Mapоб’єкти та повторювати їх Map.prototype.entries. Цитуючи приклад із цієї сторінки,

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' ]

Або

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

Вихідні дані

0 foo
1 bar
{} baz

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

1
Основний сумнів тут. Я приземлився тут, шукаючи, як це зробити в node.js, який є JavaScript на стороні сервера. Як дізнатися, яка версія ES застосовується в моєму випадку. Крім того, у випадку постійних користувачів JavaScript, що є правильним способом підтримки, оскільки я розумію, що версія ES залежить від браузера клієнта?
Sandeepan Nath

2
@SandeepanNath Ви можете використовувати веб-сайти, такі як node.green, щоб знати, чи підтримується певна функція ES у вашому Node.js. Що стосується браузерів, люди, як правило, орієнтуються на широко підтримувану версію, в даному випадку ES5. Крім цього, транспілятори (як Babel ) допомагають перетворити код ES2015 + в ES5.
thefourtheye

1
Мені подобається Object.keys(dictionary).forEach(function(key) {…дуже читабельний та сумісний.
ctrl-alt-delor

5
Object.entries(object).forEach(([key, val]) => {...});
Крімсон

Вище рішення ECMAScript 2015 викинуло "TypeScript та ітератор: Тип" IterableIterator <T> "- не тип масиву", але звичайний ol myMap (). Foreach () працював добре.
ttugates

60

Спробуйте це:

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"}

42

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ми можемо цикл по записах з так створеного масиву.

  • Оскільки нам гарантується, що кожен із так ітераційних елементів масиву є самим двома записом, ми можемо використовувати деструктуризацію для прямого присвоєння змінних keyта valueйого першого та другого пункту.


Сумно в тому, що люди все ще використовують Internet Explorer
Едвард

Я болісно усвідомлюю. Babel та polyfill.io вирішують це, але це далеко не приємно.
Лойло

19

Ви можете зробити щось подібне:

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
}

3
Гарний! Мені подобається, як працює ваша відповідь у ECMAscript 5, незважаючи на прийняту та найбільш схвальну відповідь, яка говорить, що це неможливо. Ви заслуговуєте на все набагато більше грошей.
liljoshu

18

Спробуйте це:

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

9

Вітаємо до 2020 року

Тут є досить старі відповіді - скористайтеся руйнуванням. На мою думку, це, без сумніву, найприємніший (дуже читабельний) спосіб ітерації об'єкта.

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

Тільки примітка: якщо замінити forEachз mapвище, то тоді можна агрегатні значення. mapПотім поверне список згаданих значень, таким чином потенційно спростивши код іншими способами.
Lazerbeak12345


1

за допомогою swagger-ui.js

ви можете це зробити -

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

0

Ви можете використовувати сценарій нижче.

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


#will output #c 3 # 1 a # 2 b
Майкл Пайпер

4
Подумайте, як додати пояснення до своєї відповіді, лише код є менш корисним. Крім того, ви можете редагувати свою відповідь, коментарі не мають на увазі продовження відповіді так, як ви їх використовуєте
Віктор

0

Як покращення прийнятої відповіді, щоб зменшити вкладення, ви можете зробити це замість цього, за умови, що ключ не успадковується:

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

Редагувати: інформація Object.hasOwnProperty тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.