Mit Prototype über jede Eigenschaft eines Objekts in Javascript iterieren?

89

Gibt es eine Möglichkeit, jede Eigenschaft eines Objekts mithilfe des Prototype JavaScript-Frameworks zu durchlaufen?

Hier ist die Situation: Ich erhalte eine AJAX-Antwort in JSON, die ungefähr so ​​aussieht:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Wenn ich diese JSON-Antwort in einer Variablen auswerte, responsemöchte ich in der Lage sein, über jede Eigenschaft im response.barobjObjekt zu iterieren, um festzustellen , welche Indizes wahr und welche falsch sind.

Prototyp hat beides Object.keys()und Object.values()scheint seltsamerweise keine einfache Object.each()Funktion zu haben! Ich könnte die Ergebnisse von Object.keys () und Object.values ​​() nehmen und den anderen verweisen, während ich einen durchlaufe, aber das ist so ein Hack, dass ich sicher bin, dass es einen richtigen Weg gibt, dies zu tun!

ÜberladungUT
quelle

Antworten:

42

Sie müssen zuerst Ihr Objektliteral in einen Prototyp-Hash konvertieren :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});
Triptychon
quelle
Perfekt! Genau das habe ich gesucht.
OverloadUT
57
Da eine ähnliche Frage geschlossen wurde, die nur über ein einfaches Javascript-Objekt ohne Prototyp iterieren wollte, muss ich diese Antwort jetzt leider so behandeln, als wäre sie dieselbe wie die Frage, die aufgrund von "Duplizierung" geschlossen wurde. Also ein schreckliches Beispiel, da es den Benutzer zwingt, Prototype zu laden. Der Benutzer hat nichts über Prototype gesagt, daher ist es nicht sinnvoll, ihn zum Laden einer unerwünschten Bibliothek zu zwingen. (Denken Sie daran, dies so zu behandeln, als wäre es wirklich ein Duplikat). Wenn die andere Frage aufgrund der falschen Behauptung der Vervielfältigung nicht geschlossen worden wäre, müsste ich die Antwort nicht ablehnen.
2
Hat der Fragesteller nicht erwähnt, dass er einen Prototyp haben möchte (oder wurde die Frage bearbeitet?)? Wie auch immer, es ist alles gut
Emurano
Keine Notwendigkeit, eine externe Bibliothek zu laden
Healkiss
553

Prototyp ist hier nicht erforderlich: JavaScript hat for..inSchleifen. Wenn Sie nicht sicher sind, ob sich niemand damit angelegt hat Object.prototype, überprüfen Sie dies hasOwnProperty()ebenfalls

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}
Christoph
quelle
140
Vielen Dank für die eigentliche Antwort, ohne dass wir gezwungen sind, eine unerwünschte Bibliothek zu laden.
8
Dies ist nicht die richtige Antwort. Die Fragen besagen, dass ein Prototyp verwendet werden muss! Wahlfreiheit - haha ​​...
Sven Larson
1
Der ursprüngliche Titel dieser Frage erwähnte den Prototyp, den ich der Klarheit halber wieder hinzugefügt habe. Diese Frage, wie aus der allerersten Zeile des Körpers hervorgeht, bezog sich speziell auf eine Umgebung, in der Prototype verwendet wird.
OverloadUT
1
Je mehr Sie Javascript schreiben, desto mehr hassen Sie es, forSchleifen zu schreiben :)
Triptychon
13
Leider ist dies die Frage, die als Nummer 1 auftaucht, wenn Sie bei Google nach etwas suchen, wie "über jedes Javascript für Objekteigenschaften iteriert werden kann". Daher suchen viele Leute, die hierher kommen, wahrscheinlich nach der Antwort auf diese Frage. Die Frage, die sie wollen, ist folgende: stackoverflow.com/questions/921789/… , was wirklich nichts mit Objektliteralen zu tun hat.
Baxissimo
0

Sie sollten die Tasten durchlaufen und die Werte in eckigen Klammern abrufen.

Siehe: Wie zähle ich die Eigenschaften eines Javascript-Objekts auf?

EDIT: Offensichtlich macht dies die Frage zu einem Duplikat.

Kann Berk Güder
quelle
Von dieser Methode wird in den Prototype-Dokumenten dringend abgeraten: prototypejs.org/api/array
OverloadUT
1
Ich denke auch nicht, dass dies ein Duplikat ist, da ich nach einer Prototyp-nativen Lösung gesucht habe, die ich bekommen habe. Die andere Frage ist für jemanden anständig, der nicht möchte, dass ein Framework verwendet wird, aber diese Lösung ist viel sicherer, wenn Sie Prototype verwenden.
OverloadUT
1
@OverloadUT: Sie haben nicht sorgfältig genug gelesen: Es wird davon abgeraten, die Eigenschaften von Arrays und nicht von einfachen Objekten zu durchlaufen
Christoph