Domanda

So che negli oggetti JavaScript sono doppi come hash ma non sono riuscito a trovare una funzione integrata per ottenere le chiavi

var h = {a:'b',c:'d'};

Voglio qualcosa del genere

var k = h.keys() ; // k = ['a','c'];

È semplice scrivere personalmente una funzione per scorrere gli elementi e aggiungere le chiavi a un array che restituisco, ma esiste un modo standard più pulito per farlo?

Continuo a pensare che debba essere una semplice funzione integrata che mi è sfuggita ma non riesco a trovarla!

È stato utile?

Soluzione

Esiste una funzione nel moderno JavaScript (ECMAScript 5) chiamata Object.keys eseguendo questa operazione:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

È possibile trovare i dettagli sulla compatibilità Qui.

Sul Sito Mozilla c'è anche uno snippet per la compatibilità con le versioni precedenti:

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;
}

Altri suggerimenti

Per il codice di produzione che richiede un'ampia compatibilità con i browser client, suggerisco comunque la risposta di Ivan Nevostruev sopra con shim per garantire Object.keys nei browser più vecchi.Tuttavia, è possibile ottenere l'esatta funzionalità richiesta utilizzando il nuovo software di ECMA defineProperty caratteristica.

A partire da ECMAScript 5 - Object.defineProperty

A partire da ECMA5 è possibile utilizzare Object.defineProperty() per definire proprietà non enumerabili.IL compatibilità attuale ha ancora molto da desiderare, ma alla fine dovrebbe diventare utilizzabile in tutti i browser.(Notare in particolare l'attuale incompatibilità con 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"]

Tuttavia, poiché ECMA5 è già stato aggiunto Object.keys potresti anche usare:

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

Risposta originale

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

Modificare: Dato che questa risposta è in circolazione da un po', lascerò intatto quanto sopra.Chiunque legga questo dovrebbe leggere anche la risposta di Ivan Nevostruev di seguito.

Non c'è modo di rendere le funzioni prototipo non enumerabili, il che le porta sempre a comparire in cicli for-in che non utilizzano hasOwnProperty.Penso ancora che questa risposta sarebbe l'ideale se l'estensione del prototipo di Object non fosse così complicata.

Puoi usare Object.keys

Object.keys(h)

Potresti usare Sottolineato.js, che è una libreria di utilità Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

Questo è il meglio che puoi fare, per quanto ne so...

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

utilizzando jQuery puoi ottenere le chiavi in ​​questo modo:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

O:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

grazie a @pimlottc

Credo che tu possa scorrere le proprietà dell'oggetto usando for/in, quindi potresti fare qualcosa del genere:

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

Volevo utilizzare la risposta più votata sopra

Object.prototype.keys = function () ...

Tuttavia, quando utilizzato insieme all'API di Google Maps v3, Google Maps non funziona.

for (var key in h) ...

funziona bene.

se stai cercando di ottenere solo gli elementi ma non le funzioni, questo codice può aiutarti

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

questo fa parte della mia implementazione di HashMap e voglio solo le chiavi, this è l'oggetto hashmap che contiene le chiavi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top