Wie finde ich Schlüssel eines Hashes?
-
09-06-2019 - |
Frage
Ich weiß, dass in Javascript Objekte doppelt als Hashes fungieren, aber ich konnte keine integrierte Funktion finden, um die Schlüssel abzurufen
var h = {a:'b',c:'d'};
Ich möchte so etwas wie
var k = h.keys() ; // k = ['a','c'];
Es ist einfach, selbst eine Funktion zu schreiben, um die Elemente zu durchlaufen und die Schlüssel zu einem Array hinzuzufügen, das ich zurückgebe. Aber gibt es eine standardmäßige, sauberere Möglichkeit, dies zu tun?
Ich habe immer das Gefühl, dass es sich um eine einfache integrierte Funktion handeln muss, die ich übersehen habe, aber ich kann sie nicht finden!
Lösung
Es gibt eine Funktion in modernem JavaScript (ECMAScript 5), die aufgerufen wird Object.keys
Ausführen dieses Vorgangs:
var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]
Kompatibilitätsdetails finden Sie hier Hier.
Auf der Mozilla-Site Es gibt auch einen Ausschnitt 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;
}
Andere Tipps
Für Produktionscode, der eine hohe Kompatibilität mit Client-Browsern erfordert, empfehle ich dennoch die obige Antwort von Ivan Nevostruev mit Shim, um dies sicherzustellen Object.keys
in älteren Browsern.Es ist jedoch möglich, mithilfe der neuen ECMA-Funktion genau die gewünschte Funktionalität zu erhalten defineProperty
Besonderheit.
Ab ECMAScript 5 – Object.defineProperty
Ab ECMA5 können Sie verwenden Object.defineProperty()
um nicht aufzählbare Eigenschaften zu definieren.Der aktuelle Kompatibilität lässt noch viel zu wünschen übrig, sollte aber irgendwann in allen Browsern nutzbar sein.(Beachten Sie insbesondere die aktuelle 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 hinzugefügt wurde Object.keys
Sie könnten 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 es diese Antwort schon eine Weile gibt, lasse ich das oben Gesagte unberührt.Jeder, der dies liest, sollte auch die Antwort von Ivan Nevostruev unten lesen.
Es gibt keine Möglichkeit, Prototypfunktionen nicht aufzählbar zu machen, was dazu führt, dass sie immer in For-In-Schleifen auftauchen, die nicht verwendet werden hasOwnProperty
.Ich denke immer noch, dass diese Antwort ideal wäre, wenn die Erweiterung des Prototyps von Object nicht so chaotisch wäre.
Sie können verwenden Object.keys
Object.keys(h)
Du könntest benutzen Underscore.js, eine Javascript-Dienstprogrammbibliothek.
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Soweit ich weiß, ist das das Beste, was Sie tun können ...
var keys = [];
for (var k in h)keys.push(k);
verwenden jQuery So erhalten Sie die Schlüssel:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]
Oder:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});
Danke an @pimlottc
Ich glaube, Sie können die Eigenschaften des Objekts mit for/in durchlaufen, also könnten Sie etwa Folgendes tun:
function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
}
Ich wollte die oben am besten bewertete Antwort verwenden
Object.prototype.keys = function () ...
Bei Verwendung in Verbindung mit der Google Maps API v3 ist Google Maps jedoch nicht funktionsfähig.
for (var key in h) ...
funktioniert gut.
Wenn Sie versuchen, nur die Elemente, aber nicht die Funktionen abzurufen, kann Ihnen dieser Code helfen
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if( typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
Dies ist Teil meiner Implementierung der HashMap und ich möchte nur die Schlüssel, this
ist das Hashmap-Objekt, das die Schlüssel enthält