Wie findet man die Schlüssel eines Hashes?

Ich weiß, dass in Javascript Objekte als Hashes verdoppeln, aber ich habe nicht in der Lage gewesen, eine eingebaute Funktion zu 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, eine Funktion selbst 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 sauberere Standardmethode, um 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!

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

Ab ECMAScript 5 - Object.defineProperty

Ab ECMA5 können Sie Object.defineProperty() verwenden, um nicht aufzählbare Eigenschaften zu definieren. Die gegenwärtige Kompatibilität lässt noch zu wünschen übrig, aber dies sollte schließlich in allen Browsern nutzbar werden. (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 Object.keys hinzugefügt hat, können Sie es genauso gut verwenden:

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

Originalantwort

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

Edit: Da es diese Antwort schon eine Weile gibt, lasse ich die obige unberührt. Jeder, der dies liest, sollte auch Ivan Nevostruev's 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 nicht hasOwnProperty verwenden. Ich denke immer noch, dass diese Antwort ideal wäre, wenn die Erweiterung des Prototyps von Object nicht so chaotisch wäre.

Kommentare (8)

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

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

Ich glaube, Sie können Schleife durch die Eigenschaften des Objekts mit for/in, so dass Sie so etwas wie diese tun könnte:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
Kommentare (1)