203 Stimmen

Wie kann ich die Schlüssel eines Objekts finden?

Ich kenne mich mit JavaScript aus, Objekte double als Hashes, aber ich habe keine eingebaute Funktion finden können, 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, eine Funktion selbst zu schreiben, um über die Elemente zu iterieren und fügen Sie die Schlüssel zu einem Array, das ich zurückgeben, aber gibt es eine Standard sauberer Weg, das zu tun?

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

290voto

Ivan Nevostruev Punkte 26945

In modernem JavaScript (ECMAScript 5) gibt es eine Funktion namens Object.keys diese Operation durchzuführen:

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

Einzelheiten zur Kompatibilität finden Sie unter aquí .

Auf der Mozilla-Website gibt es auch ein Snippet für die 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;
}

82voto

AnnanFay Punkte 9283

Für Produktionscode, der eine große Kompatibilität mit Client-Browsern erfordert, empfehle ich immer noch Antwort von Ivan Nevostruev mit Unterlegscheibe, um sicherzustellen Object.keys in älteren Browsern. Es ist jedoch möglich, genau die gewünschte Funktionalität zu erhalten, indem man das neue ECMA defineProperty Funktion.

Ab ECMAScript 5 - Object.defineProperty

Ab ECMA5 können Sie verwenden Object.defineProperty() um nicht aufzählbare Eigenschaften zu definieren. Die aktuelle Kompatibilität lässt noch viel zu wünschen übrig, aber das sollte irgendwann in allen Browsern nutzbar sein. (Beachten Sie insbesondere 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 eine Object.keys können Sie ebenso gut 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;
}

Editar: Da es diese Antwort schon eine Weile gibt, lasse ich das oben Gesagte unangetastet. Jeder, der dies liest, sollte auch die Antwort von Ivan Nevostruev 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 keine hasOwnProperty . Ich denke immer noch, dass diese Antwort ideal wäre, wenn die Erweiterung des Prototyps von Object nicht so chaotisch wäre.

45voto

Leticia Santos Punkte 499

Sie können verwenden Object.keys :

Object.keys(h)

33voto

timotti Punkte 339

Sie könnten verwenden Underscore.js die eine JavaScript-Dienstprogramm-Bibliothek ist.

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

14voto

danb Punkte 9941

Das ist das Beste, was Sie tun können, soweit ich weiß...

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X