Holen Sie sich ein Array von Objektschlüsseln


371

Ich möchte die Schlüssel eines JavaScript-Objekts als Array erhalten, entweder in jQuery oder in reinem JavaScript.

Gibt es einen weniger ausführlichen Weg als diesen?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

4
Abgesehen vom Hinzufügen if(foo.hasOwnProperty(key))würde ich das tun. Oder verwenden $.map.
Rocket Hazmat

10
Oh, für einen pythonischen Einzeiler ...
Richard

Eine alte Frage, die keine vollständige Antwort wert ist, aber für diejenigen, die fummeln wollen ... jsfiddle.net/LR5D9/3 Diese Lösung befasst sich mit dem Problem von Prototyp-Deklarationen, die for var in xSchleifen durcheinander bringen
unsynchronisiert

Antworten:


618

Verwendung Object.keys:

var foo = {
  'alpha': 'puffin',
  'beta': 'beagle'
};

var keys = Object.keys(foo);
console.log(keys) // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered).

Dies ist eine ES5-Funktion. Dies bedeutet, dass es in allen modernen Browsern funktioniert, jedoch nicht in älteren Browsern .

Der ES5-Shim hat eine Implementierung, die Object.keysSie stehlen können


5
Hinweis: Dies funktioniert nur in modernen Browsern (damit meine ich nicht IE <9).
Rocket Hazmat

2
Und was ist mit mobilen Browsern?
Marwen Trabelsi

1
@ SmartyTwiti: Ich bin nicht sicher. Ich würde annehmen, dass es in Chrome oder Firefox funktioniert.
Rocket Hazmat

MDN hat auch die oben genannte Polyfill, stellt jedoch Fehler in IE7 und möglicherweise 8 fest und verweist dann hier auf eine viel kürzere Polyfill: tokenposts.blogspot.com.au/2012/04/…
Campbeln

Wie hat man das vor ES5 gemacht?
Andrew S

59

Sie können jQuery's verwenden $.map.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
  return i;
});

Oder eachwenn du etwas mit ihnen machst. $.each(foo, function(index, value){/* do something with index */});
Chris

33

Dies ist natürlich Object.keys()der beste Weg, um die Schlüssel eines Objekts zu erhalten. Wenn es in Ihrer Umgebung nicht verfügbar ist, kann es mithilfe von Code wie in Ihrem Beispiel trivial angepasst werden (außer Sie müssen berücksichtigen, dass Ihre Schleife im Gegensatz Object.keys()zum Verhalten über alle Eigenschaften in der Prototypenkette iteriert ).

Ihr Beispielcode ...

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

jsFiddle .

... könnte geändert werden. Sie können die Zuordnung direkt im variablen Teil vornehmen .

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [], i = 0;
for (keys[i++] in foo) {}

jsFiddle .

Natürlich unterscheidet sich dieses Verhalten von dem, was Object.keys()tatsächlich funktioniert ( jsFiddle ). Sie können einfach die Unterlegscheibe in der MDN-Dokumentation verwenden .


8
Ich mochte diese var keys = [], i = 0; for (keys[i++] in foo) {}+1
Jashwant

Ich habe gehört, dass "for in" keine Reihenfolge garantiert. Wissen Sie, ob Object.keys dies tut?
Chris Stephens

@ChrisStephens Weder garantieren Sie die Reihenfolge, auch wenn sich die Schlüssel in einem geordneten Array befinden.
Alex

2
Alle diese Lösungen müssen hasOwnProperty()überprüft werden.
unsynchronisiert

1
@ Timineutron Es gibt keinen Grund, warum es nicht sollte :)
Alex

7

Ich weiß nicht, wie ausführlich es ist, aber ich wurde durch die Einzeiler-Anfrage dazu inspiriert, das Folgende in eine Zeile zu zwingen, weiß aber nicht, wie pythonisch es ist;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);

3
Das sollte vielleicht sein var enumerableKeysOnThePrototypeChain;)
alex

1
Vielleicht sind wir klug genug zu wissen, dass wir uns keine Sorgen um hasOwnProperty machen müssen, wenn das Objekt vollständig unter unserer Kontrolle erstellt wird und nicht von einem anderen Ort importiert wird
Dexygen

Nicht so pythonisch wie die zweite Antwort von @ alex ( for (keys[i++] in foo) {}), weil Sie immer noch spielen Array.push()(ganz zu schweigen von der Deklaration einer ganzen Funktion). Eine pythonische Implementierung sollte so weit wie möglich vom impliziten Verständnis abhängen, andernfalls sollte ein Lambda-Ausdruck verwendet werden.
Cowbert

4

Falls Sie hier nach etwas suchen, um die Schlüssel eines verschachtelten Objekts mit n Tiefen als flaches Array aufzulisten:

const getObjectKeys = (obj, prefix = '') => {
  return Object.entries(obj).reduce((collector, [key, val]) => {
    const newKeys = [ ...collector, prefix ? `${prefix}.${key}` : key ]
    if (Object.prototype.toString.call(val) === '[object Object]') {
      const newPrefix = prefix ? `${prefix}.${key}` : key
      const otherKeys = getObjectKeys(val, newPrefix)
      return [ ...newKeys, ...otherKeys ]
    }
    return newKeys
  }, [])
}

console.log(getObjectKeys({a: 1, b: 2, c: { d: 3, e: { f: 4 }}}))


1

Zusammenfassung

Zum Abrufen aller Schlüssel eines Objekts können Sie verwenden Object.keys(). Object.keys()Nimmt ein Objekt als Argument und gibt ein Array aller Schlüssel zurück.

Beispiel:

const object = {
  a: 'string1',
  b: 42,
  c: 34
};

const keys = Object.keys(object)

console.log(keys);

console.log(keys.length) // we can easily access the total amount of properties the object has

Im obigen Beispiel speichern wir ein Array von Schlüsseln in der Schlüsselkonstante. Wir können dann einfach auf die Anzahl der Eigenschaften des Objekts zugreifen, indem wir die Länge des Schlüsselarrays überprüfen.

Erhalten der Werte mit: Object.values()

Die komplementäre Funktion von Object.keys()ist Object.values(). Diese Funktion verwendet ein Objekt als Argument und gibt ein Array von Werten zurück. Zum Beispiel:

const object = {
  a: 'random',
  b: 22,
  c: true
};


console.log(Object.values(object));


1

Wenn Sie sich für Underscore.js entscheiden, sollten Sie dies besser tun

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
    keys.push(key);
});
console.log(keys);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.