Angenommen, ich erstelle ein Objekt folgendermaßen:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Was ist der beste Weg, um eine Liste der Eigenschaftsnamen abzurufen? dh ich möchte am Ende einige variable 'Schlüssel' haben, so dass:
keys == ["ircEvent", "method", "regex"]
javascript
Johnstok
quelle
quelle
_.keys(myJSONObject)
Antworten:
In modernen Browsern (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) können Sie die integrierte Object.keys- Methode verwenden:
Das obige hat eine vollständige Polyfüllung, aber eine vereinfachte Version ist:
Ersetzen Alternativ
var getKeys
mitObject.prototype.keys
, damit Sie rufen.keys()
auf ein beliebiges Objekt. Das Erweitern des Prototyps hat einige Nebenwirkungen, und ich würde es nicht empfehlen.quelle
for (var key in myObject) {...}
Technik ist nützlich für Javascript-Laufzeiten außerhalb von Browsern und V8. Wenn Sie beispielsweise JavaScript-Map-Reduce-Abfragen an Riak übergeben, ist dasObject
Objekt nicht vorhanden, sodass dieObject.keys
Methode nicht verfügbar ist.Object.keys
Methode (ECMAScript 5.1) nur die eigenen Eigenschaften des Objekts zurückgibt. Ich sehe es als wichtige Unterscheidung.Wie slashnick betonte, können Sie das Konstrukt "for in" verwenden, um ein Objekt nach seinen Attributnamen zu durchsuchen. Sie werden jedoch alle Attributnamen in der Prototypenkette des Objekts durchlaufen. Wenn Sie nur über die eigenen Attribute des Objekts iterieren möchten , können Sie die Methode Object # hasOwnProperty () verwenden. Also mit folgendem.
quelle
esc
Schlüssel gedrückt zu halten, da das Objekt ungefähr eine Million Eigenschaften hatte, von denen die meisten nicht verwendet wurden, und ich hatte eine Warnung darauf.Wie Sam Dutton antwortete, wurde in ECMAScript 5th Edition eine neue Methode für diesen Zweck eingeführt.
Object.keys()
macht, was Sie wollen und wird in Firefox 4 , Chrome 6, Safari 5 und IE 9 unterstützt .Sie können die Methode auch sehr einfach in Browsern implementieren, die sie nicht unterstützen. Einige der Implementierungen sind jedoch nicht vollständig mit Internet Explorer kompatibel. Hier ist eine kompatiblere Lösung:
Beachten Sie, dass die aktuell akzeptierte Antwort keine Prüfung auf hasOwnProperty () enthält und Eigenschaften zurückgibt , die über die Prototypenkette vererbt werden. Der berühmte DontEnum-Fehler in Internet Explorer, bei dem nicht aufzählbare Eigenschaften in der Prototypenkette dazu führen, dass lokal deklarierte Eigenschaften mit demselben Namen ihr DontEnum-Attribut erben, wird ebenfalls nicht berücksichtigt.
Durch die Implementierung von Object.keys () erhalten Sie eine robustere Lösung.
BEARBEITEN: Nach einer kürzlichen Diskussion mit kangax , einem bekannten Mitwirkenden an Prototype, habe ich die Problemumgehung für den DontEnum-Fehler basierend auf dem Code für seine hier
Object.forIn()
gefundene Funktion implementiert .quelle
Object.prototype
. Es ist jedoch häufig der Fall, dass kürzerer Code wesentlich ansprechender aussieht als größerer, robusterer Code. Bei dieser Antwort geht es jedoch darum, ECMAScript 5ths zu verwendenObject.keys()
, die in Browsern implementiert werden können, die ihn mit diesem Code nicht unterstützen. Die native Version wäre noch performanter.Object.keys
nur ein Array von Zeichenfolgen zurückgibt, die den aufzählbaren Eigenschaften eines Objekts entsprechen. Dies ist möglicherweise nicht entscheidend, wenn Sie mit nativen (benutzerdefinierten) Objekten arbeiten, sollte jedoch bei Hostobjekten sehr gut sichtbar sein (obwohl das Verhalten nicht spezifizierter Hostobjekte eine separate - schmerzhafte - Geschichte ist). Um ALLE (einschließlich nicht aufzählbarer) Eigenschaften aufzulisten, bietet ES5Object.getOwnPropertyNames
(siehe seine Unterstützung in meiner kompatiblen Tabelle - kangax.github.com/es5-compat-table )Object.keys(stuff)
und nichtstuff.keys()
?Beachten Sie, dass Object.keys und andere ECMAScript 5-Methoden von Firefox 4, Chrome 6, Safari 5, IE 9 und höher unterstützt werden.
Zum Beispiel:
ECMAScript 5-Kompatibilitätstabelle: http://kangax.github.com/es5-compat-table/
Beschreibung neuer Methoden: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
quelle
Object.getOwnPropertyNames(obj)
Diese Funktion zeigt zusätzlich zu den von gezeigten auch nicht aufzählbare Eigenschaften an
Object.keys(obj)
.In JS verfügt jede Eigenschaft über einige Eigenschaften, einschließlich eines Booleschen Werts
enumerable
.Im Allgemeinen sind nicht aufzählbare Eigenschaften "interner" und werden seltener verwendet, aber es ist aufschlussreich, sie manchmal zu untersuchen, um zu sehen, was wirklich vor sich geht.
Beispiel:
Beachten Sie auch, wie:
Object.getOwnPropertyNames
undObject.keys
gehen Sie nicht die Prototypenkette hinauf, um zu findenbase
for in
tutWeitere Informationen zur Prototypenkette finden Sie hier: https://stackoverflow.com/a/23877420/895245
quelle
Ich bin ein großer Fan der Dump-Funktion.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
quelle
https://j11y.io/demos/prettyprint/
?Könnte es mit jQuery wie folgt machen:
quelle
Wenn Sie versuchen, nur die Elemente, aber nicht die Funktionen abzurufen, kann Ihnen dieser Code helfen
Dies ist Teil meiner Implementierung der HashMap und ich möchte nur die Schlüssel. "Dies" ist das Hashmap-Objekt, das die Schlüssel enthält
quelle
Dies funktioniert in den meisten Browsern, auch in IE8, und es sind keine Bibliotheken jeglicher Art erforderlich. var i ist dein Schlüssel.
quelle
Unter Browsern, die js 1.8 unterstützen:
quelle
Mozilla verfügt über vollständige Implementierungsdetails zur Vorgehensweise in einem Browser, in dem dies nicht unterstützt wird. Wenn dies hilfreich ist:
Sie können es beliebig einfügen, möglicherweise jedoch in einer
extensions.js
Datei oben in Ihrem Skriptstapel.quelle
Verwenden
Reflect.ownKeys()
Object.keys und Object.getOwnPropertyNames können keine nicht aufzählbaren Eigenschaften erhalten. Es funktioniert sogar für nicht aufzählbare Eigenschaften.
quelle
IE unterstützt nicht (i in obj) für native Eigenschaften. Hier ist eine Liste aller Requisiten, die ich finden konnte.
Es scheint, dass Stackoverflow eine dumme Filterung durchführt.
Die Liste finden Sie unten in diesem Google-Gruppenbeitrag: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
quelle
Da ich in fast jedem Projekt underscore.js verwende , würde ich folgende
keys
Funktion verwenden:Die Ausgabe davon wird sein:
quelle
Aufbauend auf der akzeptierten Antwort.
Wenn das Objekt Eigenschaften hat, die Sie aufrufen möchten, sagen wir .properties () try!
quelle
Die Lösung funktioniert für meine Fälle und Cross-Browser:
quelle