Wenn es ein Javascript-Objekt gibt:
var objects={...};
Angenommen, es hat mehr als 50 Eigenschaften, ohne die Eigenschaftsnamen zu kennen (dh ohne die 'Schlüssel' zu kennen), wie jeder Eigenschaftswert in einer Schleife abgerufen werden kann.
javascript
javascript-objects
Mellon
quelle
quelle
Antworten:
Mit einer einfachen
for..in
Schleife:quelle
enumerable
Flag auf false gesetzt ist. Dies bedeutet unter anderem, dass Sie keine Klassenmethoden durchlaufen, sondern Methoden, die auf andere Weise erstellt wurden.Je nachdem, welche Browser Sie unterstützen müssen, kann dies auf verschiedene Arten erfolgen. Die überwiegende Mehrheit der Browser in freier Wildbahn unterstützt ECMAScript 5 (ES5). Beachten Sie jedoch, dass viele der folgenden Beispiele verwendet werden
Object.keys
, die in IE <9 nicht verfügbar sind. Siehe Kompatibilitätstabelle .ECMAScript 3+
Wenn Sie ältere Versionen von IE unterstützen müssen, ist dies die Option für Sie:
Die Verschachtelung
if
stellt sicher, dass Sie nicht über Eigenschaften in der Prototypenkette des Objekts auflisten (was das Verhalten ist, das Sie mit ziemlicher Sicherheit wollen). Du musst benutzeneher, als
Mit ECMAScript 5+ können Sie prototyplose Objekte erstellen
Object.create(null)
, und diese Objekte verfügen nicht über diehasOwnProperty
Methode. Frecher Code kann auch Objekte erzeugen, die das überschreibenhasOwnProperty
Methode .ECMAScript 5+
Sie können diese Methoden in jedem Browser verwenden, der ECMAScript 5 und höher unterstützt. Diese erhalten Werte von einem Objekt und vermeiden eine Aufzählung über die Prototypkette. Wo
obj
ist dein Objekt:Wenn Sie etwas kompakteres wollen oder mit Funktionen in Schleifen vorsichtig sein wollen, dann
Array.prototype.forEach
ist Ihr Freund:Die nächste Methode erstellt ein Array, das die Werte eines Objekts enthält. Dies ist praktisch zum Umschleifen.
Wenn Sie die Benutzer
Object.keys
sicher machen möchtennull
(wie siefor-in
sind), können Sie dies tunObject.keys(obj || {})...
.Object.keys
gibt aufzählbare Eigenschaften zurück. Für die Iteration über einfache Objekte ist dies normalerweise ausreichend. Wenn Sie etwas mit nicht aufzählbaren Eigenschaften haben, mit denen Sie arbeiten müssen, können Sie esObject.getOwnPropertyNames
anstelle von verwendenObject.keys
.ECMAScript 2015+ (AKA ES6)
Arrays lassen sich mit ECMAScript 2015 einfacher iterieren. Sie können dies zu Ihrem Vorteil nutzen, wenn Sie einzeln in einer Schleife mit Werten arbeiten:
Mit den Fettpfeilfunktionen von ECMAScript 2015 wird das Zuordnen des Objekts zu einem Array von Werten zu einem Einzeiler:
ECMAScript 2015 wird vorgestellt
Symbol
, von denen Instanzen als Eigenschaftsnamen verwendet werden können. Verwenden SieObject.getOwnPropertySymbols
diese Option, um die Symbole eines Objekts zum Aufzählen zu erhalten (diese FunktionSymbol
kann daher nicht zum Erstellen privater Eigenschaften verwendet werden). Die neueReflect
API von ECMAScript 2015 bietetReflect.ownKeys
eine Liste von Eigenschaftsnamen (einschließlich nicht aufzählbarer) und Symbolen.Array-Verständnis (nicht verwenden)
Das Array-Verständnis wurde vor der Veröffentlichung aus ECMAScript 6 entfernt . Vor ihrer Entfernung hätte eine Lösung so ausgesehen:
ECMAScript 2017+
ECMAScript 2016 fügt Funktionen hinzu, die dieses Thema nicht beeinflussen. Die ECMAScript 2017-Spezifikation fügt hinzu
Object.values
undObject.entries
. Beide geben Arrays zurück (was angesichts der Analogie zu einigen überraschend sein wirdArray.entries
).Object.values
kann unverändert oder mit einerfor-of
Schleife verwendet werden.Wenn Sie sowohl den Schlüssel als auch den Wert verwenden möchten, ist dies das Richtige
Object.entries
für Sie. Es wird ein mit[key, value]
Paaren gefülltes Array erzeugt . Sie können dies unverändert oder (beachten Sie auch die ECMAScript 2015-Destrukturierungszuweisung) in einerfor-of
Schleife verwenden:Object.values
ShimSchließlich kann es, wie in den Kommentaren und von teh_senaus in einer anderen Antwort erwähnt, sinnvoll sein, eine davon als Unterlegscheibe zu verwenden. Keine Sorge, das Folgende ändert nichts am Prototyp, sondern fügt lediglich eine Methode hinzu
Object
(die viel weniger gefährlich ist). Mit den Fettpfeilfunktionen kann dies auch in einer Zeile erfolgen:die du jetzt gerne benutzen kannst
Wenn Sie das Shimmen vermeiden möchten, wenn ein Eingeborener
Object.values
vorhanden ist, können Sie Folgendes tun:Schließlich...
Beachten Sie die Browser / Versionen, die Sie unterstützen müssen. Die obigen Angaben sind korrekt, wenn die Methoden oder Sprachfunktionen implementiert sind. Beispielsweise war die Unterstützung für ECMAScript 2015 in V8 bis vor kurzem standardmäßig deaktiviert, wodurch Browser wie Chrome unterstützt wurden. Funktionen aus ECMAScript 2015 sollten vermieden werden, bis die Browser, die Sie unterstützen möchten, die von Ihnen benötigten Funktionen implementieren. Wenn Sie Ihren Code mit babel in ECMAScript 5 kompilieren, haben Sie Zugriff auf alle Funktionen in dieser Antwort.
quelle
obj
zweimal erwähnen müssen . Ich denke, eine Hilfsfunktion zu erstellen ist unvermeidlich? So etwas wie Werte (obj).Object.values = obj => Object.keys(obj).map(key => obj[key]);
Hier ist eine wiederverwendbare Funktion zum Abrufen der Werte in ein Array. Es werden auch Prototypen berücksichtigt.
quelle
Object
ist kein großes Problem (Object.keys
ist ein häufiges Problem ). Sie denken wahrscheinlich daran, den Objektprototyp zu ändern.hasOwnProperty()
? Wie würde der Schlüssel innerhalb der Schleife dieses Objekts wiederholt werden, wenn die Eigenschaft nicht vorhanden ist?Wenn Sie Zugriff auf Underscore.js haben, können Sie die folgende
_.values
Funktion verwenden:quelle
Wenn Sie wirklich ein Array von Werten wollen, finde ich das sauberer als das Erstellen eines Arrays mit einer for ... in-Schleife.
ECMA 5.1+
Es ist erwähnenswert, dass Sie in den meisten Fällen nicht wirklich eine Reihe von Werten benötigen. Dies geht schneller:
Dies iteriert über die Schlüssel des Objekts o. In jeder Iteration wird k auf einen Schlüssel von o gesetzt.
quelle
ES5
Object.keys
quelle
Sie können die Tasten durchlaufen:
wird ausgegeben:
quelle
Für diejenigen, die sich frühzeitig an die CofeeScript-Ära gewöhnt haben, ist hier ein weiteres Äquivalent dafür.
Was vielleicht besser ist, weil das
objects
reduziert werden kann, um erneut getippt zu werden, und die Lesbarkeit verringert.quelle
Verwenden Sie eine Polyfüllung wie:
dann benutze
3) Gewinn!
quelle
Ab ECMA2017:
Object.values(obj)
ruft Ihnen alle Eigenschaftswerte als Array ab.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
quelle
Anscheinend ist dies - wie ich kürzlich erfahren habe - der schnellste Weg, dies zu tun:
quelle
Die Frage gibt nicht an, ob auch geerbte und nicht aufzählbare Eigenschaften gewünscht werden.
Es gibt eine Frage zum Abrufen von allem, geerbten Eigenschaften und nicht aufzählbaren Eigenschaften , die Google nicht leicht finden kann.
Meine Lösung dafür ist:
Und dann iterieren Sie über sie, verwenden Sie einfach eine for-of-Schleife:
Code-Snippet anzeigen
quelle
Verwenden Sie :
Object.values()
, wir übergeben ein Objekt als Argument und erhalten ein Array der Werte als Rückgabewert.Dies gibt ein Array eines bestimmten Objekts mit eigenen aufzählbaren Eigenschaftswerten zurück. Sie erhalten dieselben Werte wie bei Verwendung der
for in
Schleife, jedoch ohne die Eigenschaften des Prototyps. Dieses Beispiel wird wahrscheinlich die Dinge klarer machen:quelle
quelle
Hier ist eine Funktion ähnlich der Array_values () von PHP
So ermitteln Sie die Werte des Objekts, wenn Sie ES6 oder höher verwenden:
quelle
Kompatibel mit ES7, selbst einige Browser unterstützen dies noch nicht
Da
Object.values(<object>)
wird in ES7 eingebaut &Bis alle Browser darauf warten, dass es unterstützt wird, können Sie es in eine Funktion einschließen:
Dann :
Sobald die Browser mit ES7 kompatibel sind, müssen Sie nichts mehr an Ihrem Code ändern.
quelle
Mir ist klar, dass ich etwas spät dran bin, aber hier ist eine Unterlegscheibe für die neue Firefox 47-
Object.values
Methodequelle
Object.entries machen es besser.
quelle
const myObj = { a:1, b:2, c:3 }
Holen Sie sich alle Werte:
der kürzeste Weg:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
quelle
quelle
in ECMAScript5 verwenden
Andernfalls, wenn Ihr Browser dies nicht unterstützt, verwenden Sie den bekannten
for..in loop
quelle
object[key]
die Werte in einer Schleife abrufen können.for..in
(und hasOwnProperty) gemacht werden, so dass es nicht wirklich etwas bringt. Ich wünschte, ECMAScript 5th definiertObject.pairs
(undObject.items
für[[key, value], ..]
), aber leider nicht.Jetzt verwende ich Dojo Toolkit, da ältere Browser dies nicht unterstützen
Object.values
.Ausgabe :
quelle
verwenden
und wenn Sie Google Chrome verwenden, öffnen Sie die Konsole mit Strg + Umschalt + j
Gehe zu >> Konsole
quelle