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.