Website-Suche

javascript - Wie kann ich die Schlüssel eines Objekts finden?


Ich weiß, dass in JavaScript Objekte auch als Hashes dienen, aber ich konnte keine eingebaute Funktion finden, um die Schlüssel zu erhalten:

var h = {a:'b', c:'d'};

Ich möchte etwas wie

var k = h.keys() ; // k = ['a', 'c'];

Es ist einfach, selbst eine Funktion zu schreiben, um über die Elemente zu iterieren und die Schlüssel zu einem Array hinzuzufügen, das ich zurückgebe, aber gibt es eine standardmäßige sauberere Methode, dies zu tun?

Ich habe ständig das Gefühl, dass es eine einfache eingebaute Funktion sein muss, die ich übersehen habe, aber ich kann sie nicht finden!

Antwort #1

In modernem JavaScript (ECMAScript 5) gibt es eine Funktion namens Object.keys, die diese Operation ausführt:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

Kompatibilitätsdetails können hier gefunden werden.

Auf der Mozilla-Website gibt es zudem einen Ausschnitt zur Abwärtskompatibilität:

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

Antwort #2

Für Produktionscode, der eine große Kompatibilität mit Client-Browsern erfordert, schlage ich immer noch die Antwort von Ivan Nevostruev mit Shim vor, um Object.keys in älteren Browsern sicherzustellen. Es ist jedoch möglich, die genau gewünschte Funktionalität mithilfe der neuen defineProperty-Funktion von ECMA zu erreichen.

Ab ECMAScript 5 - Object.defineProperty

Ab ECMA5 können Sie Object.defineProperty() verwenden, um nicht aufzählbare Eigenschaften zu definieren. Die aktuelle Kompatibilität lässt noch viel zu wünschen übrig, aber dies sollte schließlich in allen Browsern nutzbar werden. (Beachten Sie speziell die derzeitige Inkompatibilität mit IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

OUTPUT
> a 1
> b 2
> ["a", "b"]

Da ECMA5 jedoch bereits Object.keys hinzugefügt hat, können Sie genauso gut Folgendes verwenden:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Ursprüngliche Antwort

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Bearbeiten: Da diese Antwort schon eine Weile existiert, lasse ich das Obige unverändert. Jeder, der dies liest, sollte auch Ivan Nevostruevs Antwort unten lesen.

Es gibt keine Möglichkeit, Prototyp-Funktionen nicht aufzählbar zu machen, was dazu führt, dass sie immer in for-in-Schleifen auftauchen, die hasOwnProperty nicht verwenden. Ich denke immer noch, dass diese Antwort ideal wäre, wenn das Erweitern des Prototyps von Object nicht so unordentlich wäre.

Antwort #3

Sie können Object.keys verwenden:

Object.keys(h)

Antwort #4

Sie könnten Underscore.js verwenden, eine JavaScript-Dienstbibliothek.

_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]

Antwort #5

Das ist das Beste, was du tun kannst, soweit ich weiß...

var keys = [];
for (var k in h)keys.push(k);

Verwandte Artikel