2015-11-26 12 views
21

Ich möchte über alle Werte einer Karte iterieren. Ich weiß, dass es möglich ist, iterate over all keys. Aber ist es möglich, direkt über die Werte zu iterieren?Javascript: Iterieren über Werte der Karte

+1

Die Frage ist so verbreitet, dass ich mich frage dass niemand es vorher gefragt hat. Aber ich kann keine Frage so auf stackoverflow finden. –

+0

U iterate kvps. Nicht nur Schlüssel, Sie können innerhalb einer Iteration auf die Schlüsselwerte oder auf beide zugreifen. Karte [Schlüssel] wäre der Wert der Iteration –

+0

@kcbeard - können Sie Ihren Anspruch (* U iterate kvps *) mit einigen Proofs/Spezifikation unterstützen? – Amit

Antwort

23

Es ist keine Karte. Es ist einfach ein Object.

Bearbeiten:unter Code ist schlechter als OP's, wie Amit in den Kommentaren darauf hingewiesen.

Sie können "iterieren über die Werte" von tatsächlich Iterieren über die Tasten mit:

var value; 
Object.keys(map).forEach(function(key) { 
    value = map[key]; 
    console.log(value); 
}); 
+2

Ich hoffte, dass es einen eleganteren Weg geben würde. –

+0

@Matthias es mag auf den ersten Blick nicht so aussehen, aber es macht absolut Sinn, wenn Sie einen wichtigen Punkt betrachten: Die Reihenfolge der Eigenschaften in einem Objekt wird nicht erzwungen. z.B. Wenn Sie '{a: 1, b: 2, c: 3}' und for loop sagen oder die 'Object.keys' durchlaufen, können Sie nicht wirklich 1, 2, 3, also eine direkte Schleife von Werte machen nicht so viel Sinn. Die 'for ... in' (und Object.keys) ist näher an einer Schleife, die nur sagt:" Solange noch Eigenschaften übrig sind, erhalten Sie eine andere Eigenschaft ". 'Schlüssel' gibt Ihnen einen Platz zum Erzwingen der Bestellung, z. 'Object.keys (myobj) .sort(). ForEach (x => console.log (x)' –

+4

Ich sehe nicht, wie das ist besser als OP's 'für (var key in map) {map [key] } '. Es ist länger, weniger lesbar, es verschwendet Speicher, ist die Ausführung langsamer - gibt es überhaupt einen Grund dafür? – Amit

0

Nein, es gibt keine direkte Methode, um das mit Objekten zu tun.

Der Map Typ hat eine values() Methode, die einen Iterator für die Werte

6

Im Sinne kehrt Ich glaube, Sie beabsichtigten, in ES5 oder ES2015, nein, nicht ohne Arbeit an Ihrer Seite.

In ES2016, wahrscheinlich mit object.values.

Beachten Sie, dass Arrays in JavaScript effektiv eine Zuordnung von einer Ganzzahl zu einem Wert sind und die Werte in JavaScript-Arrays direkt aufgelistet werden können.

['foo', 'bar'].forEach(v => console.log(v)); // foo bar 

Auch in ES2015, können Sie ein Objekt iterable, indem eine Funktion auf eine Eigenschaft mit dem Namen Symbol.iterator machen:

var obj = { 
    foo: '1', 
    bar: '2', 
    bam: '3', 
    bat: '4', 
}; 

obj[Symbol.iterator] = iter.bind(null, obj); 

function* iter(o) { 
    var keys = Object.keys(o); 
    for (var i=0; i<keys.length; i++) { 
     yield o[keys[i]]; 
    } 
} 

for(var v of obj) { console.log(v); } // '1', '2', '3', '4' 

Auch pro andere Antworten gibt es auch andere Einbauten Diese bieten die gewünschte Funktionalität, wie Map (aber nichtWeakMap weil es nicht iterierbar ist) und Set zum Beispiel (aber diese sind nicht in allen Browsern noch vorhanden).