Jak iterować (klucze, wartości) w javascript?

335

Mam słownik w formacie

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

Jak mogę iterować w tym słowniku, wykonując coś podobnego

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}
nbroeking
źródło
3
for (let [key, value] of Object.entries(obj)), potrzebujesz Babel.
elclanrs 21.01.16
1
@elclanrs Jest w ES2016 i nie jest jeszcze ustandaryzowany :-)
thefourtheye 21.01.2016
2
Możliwy duplikat For-each nad tablicą w JavaScript?
sdc
@dooagain, to nie jest tablica w tym pytaniu.
zangw

Odpowiedzi:

479

tl; dr

  1. W ECMAScript 5 nie jest to możliwe.
  2. W ECMAScript 2015 jest to możliwe dzięki Maps.
  3. W ECMAScript 2017 byłby łatwo dostępny.

ECMAScript 5:

Nie, nie jest to możliwe w przypadku obiektów.

Powinieneś albo iterować z for..in, albo Object.keys, w ten sposób

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]);
    }
}

Uwaga:if warunek powyżej jest konieczne, tylko jeśli chcesz iteracyjne właściwości, które są dictionaryprzedmiotem bardzo własne. Ponieważ for..inbędzie iterować przez wszystkie odziedziczone wyliczalne właściwości.

Lub

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

ECMAScript 2015

W ECMAScript 2015 możesz używać Mapobiektów i iterować je Map.prototype.entries. Cytując przykład z tej strony,

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

Lub iteruj w for..often sposób

'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);
}

Wynik

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

Lub

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

Wynik

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017 wprowadziłby nową funkcję Object.entries. Możesz użyć tego do iteracji obiektu, jak chcesz.

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

Wynik

a 1
b 2
c 3
thefourtheye
źródło
1
Podstawowa wątpliwość tutaj. Wylądowałem tutaj, szukając sposobu na zrobienie tego w node.js, czyli javascript po stronie serwera. Skąd mam wiedzieć, która wersja ES ma zastosowanie w moim przypadku. Ponadto, w przypadku zwykłych użytkowników javascript, jaki jest właściwy sposób wsparcia, ponieważ rozumiem, że wersja ES zależy od przeglądarki klienta?
Sandeepan Nath,
2
@SandeepanNath Możesz używać stron internetowych takich jak node.green, aby wiedzieć, czy dana funkcja ES jest obsługiwana w twoim Node.js. Jeśli chodzi o przeglądarki, ludzie zazwyczaj celują w wersję, która jest szeroko obsługiwana, w tym przypadku ES5. Oprócz tego transpilatory (takie jak Babel ) pomagają w konwersji kodu ES2015 + na ES5.
thefourtheye
1
Lubię Object.keys(dictionary).forEach(function(key) {…bardzo czytelny i kompatybilny.
ctrl-alt-delor
5
Object.entries(object).forEach(([key, val]) => {...});
Krimson
Rozwiązanie ECMAScript 2015 powyżej rzuciło „TypeScript and Iterator: Type 'IterableIterator <T>' nie jest typem tablicy”, ale zwykła wersja myMap (). Foreach () działała dobrze.
ttugates,
60

Spróbuj tego:

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"}
alex10
źródło
42

Object.entries()Metoda została określona w ES2017 (i jest obsługiwany we wszystkich nowoczesnych przeglądarkach ):

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

Wyjaśnienie:

  • Object.entries()przyjmuje obiekt jak { a: 1, b: 2, c: 3 }i zamienia ją w tablicy par klucz-wartość: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • Za pomocą for ... ofmożemy zapętlać wpisy tak utworzonej tablicy.

  • Ponieważ mamy gwarancję, że każdy z tak iterowanych elementów tablicy sam w sobie jest tablicą z dwoma wpisami, możemy użyć destrukcji, aby bezpośrednio przypisać zmienne keyoraz valuedo pierwszego i drugiego elementu.

Loilo
źródło
Smutne jest to, że ludzie nadal używają Internet Explorera
Edward
Jestem boleśnie świadomy. Babel i polyfill.io rozwiązują ten problem, ale nie jest to przyjemne.
Loilo,
19

Możesz zrobić coś takiego:

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
}
Dhaval Chaudhary
źródło
3
Piękny! Uwielbiam sposób, w jaki działa Twoja odpowiedź w ECMAscript 5, pomimo zaakceptowanej i najbardziej pozytywnej odpowiedzi, mówiącej, że nie jest to możliwe. Zasługujesz na jeszcze więcej pozytywnych opinii.
liljoshu
18

Spróbuj tego:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}
AMACB
źródło
9

WITAMY W 2020 * Drools w ES6 *

Oto kilka dość starych odpowiedzi - skorzystaj z destrukcji. Moim zdaniem jest to bez wątpienia najlepszy (bardzo czytelny) sposób na iterację obiektu.

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})
Steve
źródło
Tylko uwaga: jeśli zastąpi forEachsię mappowyżej, to wtedy możliwe wartości zagregowanych. mapzwróci następnie listę wymienionych wartości, potencjalnie upraszczając kod na inne sposoby.
Lazerbeak12345
1

using swagger-ui.js

możesz to zrobić -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });
deeshank
źródło
0

Możesz użyć poniższego skryptu.

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);
}

wyjścia
1 a
2 b
c 3

Michael Piper
źródło
# wyjdzie #c 3 # 1 a # 2 b
Michael Piper,
4
Zastanów się nad dodaniem wyjaśnienia do swojej odpowiedzi, sam kod jest mniej pomocny. Możesz także edytować swoją odpowiedź, komentarze nie mają stanowić rozszerzenia odpowiedzi w sposób, w jaki je wykorzystujesz
Viktor,
0

Aby ulepszyć zaakceptowaną odpowiedź, aby zmniejszyć zagnieżdżanie, możesz to zrobić zamiast tego, pod warunkiem, że klucz nie zostanie odziedziczony:

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

Edycja: informacje o Object.hasOwnProperty tutaj

kloddant
źródło