Come trovare le chiavi di un hash?

So che gli oggetti javascript sono doppi come hash ma non sono riuscito a trovare una funzione incorporata per ottenere le chiavi

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

Voglio qualcosa di simile

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

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

Continuo a sentire che deve essere una semplice funzione incorporata che mi è sfuggita ma non riesco a trovarla!

C’è una funzione in javascript moderno (ECMAScript 5) chiamata Object.keys esegue questa operazione:

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

I dettagli di compatibilità possono essere trovati qui .

Sul sito di Mozilla c’è anche una possibilità di retrocompatibilità:

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

Per il codice di produzione che richiede una grande compatibilità con i browser client, suggerisco ancora la risposta di Ivan Nevostruev sopra con shim per garantire Object.keys nei browser più vecchi. Tuttavia, è ansible ottenere l’esatta funzionalità richiesta utilizzando la nuova funzione defineProperty ECMA.

A partire da ECMAScript 5 – Object.defineProperty

A partire da ECMA5 è ansible utilizzare Object.defineProperty() per definire proprietà non enumerabili. La compatibilità attuale ha ancora molto da desiderare, ma dovrebbe diventare utilizzabile in tutti i browser. (Nota 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, dal momento che ECMA5 ha già aggiunto Object.keys si potrebbe 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; } 

Edit: Dal momento che questa risposta è stata in giro per un po ‘lascerò intatto quanto sopra. Chiunque legga questo dovrebbe anche leggere la risposta di Ivan Nevostruev qui sotto.

Non c’è modo di rendere le funzioni di prototipo non enumerabili, il che le porta sempre ad apparire in loop for-in che non usano hasOwnProperty . Penso ancora che questa risposta sarebbe l’ideale se estendere il prototipo di Object non fosse così disordinato.

puoi usare Object.keys

 Object.keys(h) 

Potresti usare Underscore.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); 

usando 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 puoi scorrere le proprietà dell’object usando / per, in modo da poter fare qualcosa del genere:

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

Volevo usare la risposta più votata sopra

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

Tuttavia, quando si utilizza in combinazione con l’API di google maps v3, google maps non è funzionale.

 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’object hashmap che contiene le chiavi