3599 Stimmen

Wie kann ich ein JavaScript-Objekt in einer Schleife durchlaufen oder aufzählen?

Ich habe ein JavaScript-Objekt wie das folgende:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Jetzt möchte ich eine Schleife durch alle p Elemente ( p1 , p2 , p3 ...) und ihre Schlüssel und Werte erhalten. Wie kann ich das tun?

Ich kann das JavaScript-Objekt bei Bedarf ändern. Mein ultimatives Ziel ist es, eine Schleife durch einige Schlüssel-Wert-Paare zu ziehen, und wenn möglich, möchte ich die Verwendung von eval .

63voto

Bryan Punkte 3371

Sie können einfach darüber iterieren wie:

for (var key in p) {
  alert(p[key]);
}

Beachten Sie, dass key nimmt nicht den Wert der Eigenschaft an, sondern ist nur ein Indexwert.

15 Stimmen

Dies ist eine Wiederholung und nicht einmal ganz korrekt. Sie müssen eine Prüfung von hasOwnProperty haben, damit dies richtig funktioniert

4 Stimmen

Ich habe diesen Beitrag zunächst aufgrund des obigen Kommentars heruntergestuft, bis mir klar wurde, dass diese Antwort zuerst kam und daher nicht "wiederholt" wird. Es ist möglicherweise unvollständig, aber funktioniert einfach gut für viele Fälle.

58voto

Pencroff Punkte 999

In ECMAScript 5 gibt es einen neuen Ansatz für Iterationsfelder von Literalen - Object.keys

Weitere Informationen finden Sie unter MDN

Ich habe mich für die folgende Lösung entschieden, die in den aktuellen Browserversionen (Chrome30, IE10, FF25) schneller ist

var keys = Object.keys(p),
    len = keys.length,
    i = 0,
    prop,
    value;
while (i < len) {
    prop = keys[i];
    value = p[prop];
    i += 1;
}

Sie können die Leistung dieses Ansatzes mit verschiedenen Implementierungen auf jsperf.com :

Die Browserunterstützung können Sie unter Kangax's Kompatibilitätstabelle

Für alte Browser haben Sie einfach y vollständig Polyfill

UPD:

Leistungsvergleich für die gängigsten Fälle in dieser Frage auf perfjs.info :

Objektliterale Iteration

1 Stimmen

In der Tat, ich wollte diese Methode einfach nur veröffentlichen. Aber Sie sind mir zuvorgekommen :(

38voto

Richard Levasseur Punkte 13763
for(key in p) {
  alert( p[key] );
}

Hinweis: Sie können dies über Arrays tun, aber Sie werden über die length und auch andere Eigenschaften.

4 Stimmen

Wenn Sie eine solche for-Schleife verwenden, key nimmt einfach einen Indexwert an, so dass nur 0, 1, 2 usw. gemeldet wird. Sie müssen auf p[Schlüssel] zugreifen.

1 Stimmen

Es ist die langsamste Methode der Array-Iteration in JavaScript. Sie können dies auf Ihrem Computer überprüfen - Beste Methode zur Iteration über Arrays in JavaScript

7 Stimmen

@Pencroff: das Problem ist, dass es in der Frage nicht um das Durchlaufen von Arrays geht... ;)

23voto

Francis Lewis Punkte 8592

Nach dem Blick durch alle Antworten in hier, hasOwnProperty ist nicht für meine eigene Verwendung erforderlich, weil mein Json-Objekt sauber ist; Es gibt wirklich keinen Sinn in das Hinzufügen von zusätzlichen Javascript-Verarbeitung. Dies ist alles, was ich bin mit:

for (var key in p) {
    console.log(key + ' => ' + p[key]);
    // key is key
    // value is p[key]
}

19 Stimmen

Ob das JSON-Objekt sauber ist oder nicht, ist irrelevant. Wenn zu irgendeinem anderen Zeitpunkt ein Code eine Eigenschaft auf Object.prototype dann wird sie aufgezählt durch for..in . Wenn Sie sicher sind, dass Sie keine Bibliotheken verwenden, die das tun, dann müssen Sie nicht die hasOwnProperty .

4 Stimmen

Es kann vollständig sauber sein, wenn es mit Object.create(null)

21voto

strider Punkte 4984

Via Prototyp mit forEach() die die Prototypenkette Eigenschaften:

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}

//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3

2 Stimmen

Seien Sie vorsichtig mit dem Prototyp: obj = { print: 1, each: 2, word: 3 } produziert TypeError: number is not a function . Verwendung von forEach um den ähnlichen Array Funktion kann das Risiko etwas verringern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X