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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top