Come iterare (chiavi, valori) in javascript?


335

Ho un dizionario che ha il formato di

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

Come posso scorrere questo dizionario facendo qualcosa di simile

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)), ho bisogno di Babele.
elclanrs,


1
@elclanrs È in ES2016 e non è ancora standardizzato :-)
thefourtheye


@dooagain, non è un array in questa domanda.
zangw,

Risposte:


480

tl; dr

  1. In ECMAScript 5, non è possibile.
  2. In ECMAScript 2015, è possibile con Maps.
  3. In ECMAScript 2017, sarebbe prontamente disponibile.

ECMAScript 5:

No, non è possibile con gli oggetti.

Dovresti eseguire l'iterazione for..ino Object.keys, in questo modo

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

Nota: la ifcondizione sopra è necessaria, solo se si desidera iterare le proprietà dictionaryproprie dell'oggetto. Perché for..initererà attraverso tutte le proprietà enumerabili ereditate.

O

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

ECMAScript 2015

In ECMAScript 2015, è possibile utilizzare Mapoggetti e iterarli con Map.prototype.entries. Citando un esempio da quella pagina,

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

O iterare con for..of, in questo modo

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

Produzione

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

O

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

Produzione

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017 introdurrebbe una nuova funzione Object.entries. Puoi usarlo per iterare l'oggetto come desideri.

'use strict';

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

Produzione

a 1
b 2
c 3

1
Un dubbio di base qui. Sono atterrato qui cercando come farlo in node.js, che è JavaScript sul lato server. Come faccio a sapere quale versione ES si applica al mio caso. Inoltre, nel caso di utenti javascript regolari, qual è il modo corretto di supportare poiché ho compreso che la versione ES dipende dal browser del client?
Sandeepan Nath,

2
@SandeepanNath Puoi usare siti web come node.green per sapere se una particolare funzione ES è supportata in Node.js. Per quanto riguarda i browser, le persone generalmente scelgono come target la versione ampiamente supportata, in questo caso ES5. A parte questo, i transpiler (come Babel ) aiutano a convertire il codice ES2015 + in ES5.
thefourtheye,

1
Mi piace Object.keys(dictionary).forEach(function(key) {…molto leggibile e compatibile.
ctrl-alt-delor,

6
Object.entries(object).forEach(([key, val]) => {...});
Krimson


60

Prova questo:

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

Il Object.entries()metodo è stato specificato in ES2017 (ed è supportato in tutti i browser moderni ):

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

Spiegazione:

  • Object.entries()prende un oggetto come { a: 1, b: 2, c: 3 }e lo trasforma in una matrice di coppie di valori-chiave: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • Con for ... ofpossiamo scorrere le voci dell'array così creato.

  • Poiché siamo certi che ciascuno degli elementi dell'array così iterati sia esso stesso un array a due voci, possiamo usare la destrutturazione per assegnare direttamente le variabili keye valueal suo primo e secondo elemento.


La cosa triste è che le persone usano ancora Internet Explorer
Edward

Sono dolorosamente consapevole. Babel e polyfill.io risolvono questo problema, ma è tutt'altro che divertente.
Loilo,

19

Puoi fare qualcosa del genere:

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
Bellissimo! Adoro come funziona la tua risposta in ECMAscript 5 nonostante la risposta accettata e più votata che dice che non è possibile. Ti meriti molti più voti.
liljoshu,

18

Prova questo:

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

9

BENVENUTO AL 2020 * Drools in ES6 *

Ci sono alcune risposte piuttosto vecchie qui - approfitta della destrutturazione. A mio avviso, questo è senza dubbio il modo migliore (molto leggibile) per iterare un oggetto.

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

Solo una nota: se si sostituisce forEachcon mapsopra, è quindi possibile aggregare i valori. maprestituirà quindi un elenco di detti valori, potenzialmente semplificando il codice in altri modi.
Lazerbeak12345,


1

usando swagger-ui.js

Puoi farlo -

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

0

Puoi usare lo script seguente.

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

uscite
1 a
2 b
c 3


#will output #c 3 # 1 a # 2 b
Michael Piper

4
Considera di aggiungere una spiegazione alla tua risposta, il solo codice è meno utile. Inoltre, puoi modificare la tua risposta, i commenti non sono pensati per essere un'estensione della risposta nel modo in cui li stai usando
Viktor

0

Come miglioramento della risposta accettata, al fine di ridurre l'annidamento, è possibile farlo invece, a condizione che la chiave non sia ereditata:

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

Modifica: informazioni su Object.hasOwnProperty qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.