2016-01-21 1 views
61

Ich habe ein Wörterbuch, das das Format vonWie iterieren (Schlüssel, Werte) in Javascript?

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

hat Wie kann ich durch dieses Wörterbuch iterieren durch so etwas wie

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

'für (let [key, value] von Object.entries (obj))', müssen Babel. – elclanrs

+3

[möglich duplizieren] (http://stackoverflow.com/questions/7241878/for-in-loops-in-javascript-key-value-pairs) – Tholle

+0

@elclanrs Es in ES2016 und es ist noch nicht standardisiert :-) – thefourtheye

Antwort

100

tl tun; dr

  1. In ECMAScript 5 , es ist nicht möglich.
  2. In ECMAScript 2015 ist es möglich mit Map s.
  3. In ECMAScript 2017 wäre es leicht verfügbar.

ECMAScript 5:

Nein, es ist nicht möglich, mit Objekten.

Sie sollten entweder iterieren mit for..in oder Object.keys, wie diese

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

Hinweis: Die if Bedingung oben ist erforderlich, nur, wenn Sie die Eigenschaften iterieren wollen, die sehr eigene dictionary Objekts sind. Weil for..in alle vererbten aufzählbaren Eigenschaften durchlaufen wird.

Oder

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

ECMAScript 2015

In ECMAScript 2015 können Sie Map Objekte verwenden und iterieren sie mit Map.prototype.entries. Zitiert Beispiel von dieser Seite,

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

Oder iterieren mit for..of, wie dieser

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

Ausgabe

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

Oder

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

Ausgabe

0 foo 
1 bar 
{} baz 

ECMAScript 2017

ECMAScript 2017 würde eine neue Funktion Object.entries einzuführen. Sie können dies verwenden, um das Objekt wie gewünscht zu iterieren.

'use strict'; 

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

Ausgabe

a 1 
b 2 
c 3 
+2

Kartenfunktion in ECMA 2015 ist genial. Danke, dass Sie Ihre Nachricht auf dem neuesten Stand halten. +1. – RBT

4

Versuchen Sie folgendes:

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

Versuchen Sie folgendes:

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

Sie können so etwas tun:

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

Da ES2017 (also seien Sie vorsichtig mit browser support) die Object.entries() die Frage des genannten Verfahrens in first comment standardisiert wurde:

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

Erläuterung:

  • Object.entries() wie ein Objekt nimmt { a: 1, b: 2, c: 3 } und verwandelt es in ein Array von Schlüssel-Wert-Paaren: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

  • Mit for ... of können wir eine Schleife über jeden Eintrag dieser erstellt Array

  • Da wir garantiert, dass jede der so iterierter Array-Elemente ist eine weitere Zwei-Entry-Array können wir destructuring verwenden, um Weisen Sie die Variablen key und value direkt dem ersten und zweiten Element zu.

1

mit Prahlerei-ui.js

Sie können dies tun -

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