Ich weiß, dass in Javascript Objekte doppelt so viele Hashes sind, aber ich konnte keine eingebaute Funktion finden, um die Schlüssel zu erhalten
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 sauberere Standardmethode, um dies zu tun?
Ich habe immer das Gefühl, dass es eine einfache eingebaute Funktion sein muss, die ich verpasst habe, aber ich kann sie nicht finden!
javascript
object
key
Klopfen
quelle
quelle
Antworten:
In modernem JavaScript (ECMAScript 5) gibt es eine Funktion,
Object.keys
die diese Operation ausführt:Details zur Kompatibilität finden Sie hier .
Auf der Mozilla-Site gibt es auch einen Ausschnitt zur Abwärtskompatibilität:
quelle
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
machtkeys
für alle Unterklassen von Object zur Verfügung, also für alle Objekte. Was Sie wahrscheinlich möchten, wenn Sie versuchen, OOP zu verwenden. Auf jeden Fall hängt dies wirklich von Ihren Anforderungen ab.Für Produktionscode, der eine große Kompatibilität mit Client-Browsern erfordert, empfehle ich weiterhin Ivan Nevostruevs Antwort oben mit Shim, um dies
Object.keys
in älteren Browsern sicherzustellen . Mit der neuen Funktion von ECMA ist es jedoch möglich, die genaue angeforderte Funktionalität zu erhaltendefineProperty
.Ab ECMAScript 5 - Object.defineProperty
Ab ECMA5 können Sie
Object.defineProperty()
nicht aufzählbare Eigenschaften definieren. Die aktuelle Kompatibilität lässt noch zu wünschen übrig, sollte aber irgendwann in allen Browsern verwendbar sein. (Beachten Sie insbesondere die aktuelle Inkompatibilität mit IE8!)Da ECMA5 jedoch bereits hinzugefügt wurde, können
Object.keys
Sie auch Folgendes verwenden:Ursprüngliche Antwort
Bearbeiten: Da es diese Antwort schon eine Weile gibt, werde ich das oben Gesagte unberührt lassen. Wer 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.quelle
Sie können verwenden
Object.keys
quelle
Sie können Underscore.js verwenden , eine Javascript-Dienstprogrammbibliothek.
quelle
Object.prototype
_.keys(obj).length
um zu sehen, ob es irgendwelche Schlüssel gibt.Soweit ich weiß, ist dies das Beste, was Sie tun können ...
quelle
Mit jQuery können Sie die Schlüssel wie folgt erhalten:
Oder:
danke an @pimlottc
quelle
JQuery.map
$.map(h, function(v,k) { return k; });
Ich glaube, Sie können die Eigenschaften des Objekts mit for / in durchlaufen, um so etwas zu tun:
quelle
Ich wollte die oben am besten bewertete Antwort verwenden
In Verbindung mit der Google Maps API v3 ist Google Maps jedoch nicht funktionsfähig.
funktioniert gut.
quelle
Wenn Sie versuchen, nur die Elemente, aber nicht die Funktionen abzurufen, kann Ihnen dieser Code helfen
}}
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ältquelle