Știu că în javascript Obiecte dublu ca hash-uri dar am fost în imposibilitatea de a găsi o construit în funcție pentru a obține cheile
var h = {a:'b',c:'d'};
Vreau ceva de genul
var k = h.keys() ; // k = ['a','c'];
Este simplu de a scrie o funcție mine pentru a itera peste articole și se adaugă cheile de la o matrice care mă voi întoarce, dar există un standard mai curat mod de a face asta?
Am sentimentul că trebuie să fie un simplu construit în funcție de care am ratat-o dar nu pot't găsi!
Există funcția moderne JavaScript (ECMAScript 5), numit Obiect.tastele
a efectua această operație:
var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]
Compatibilitate detalii pot fi găsite aici.
Pe ul Mozilla există, de asemenea, un fragment de compatibilitate:
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;
}
Pentru codul de producție care necesită o mare compatibilitate cu clientul browsere vă sugerez încă Ivan Nevostruev's răspuns mai sus cu shim pentru a asigura Obiect.cheile în browsere mai vechi. Cu toate acestea,'s posibil pentru a obține funcționalitatea exactă a solicitat ajutorul ECMA's nou
defineProperty` caracteristică.
Cum de ECMAScript 5 - Obiect.defineProperty
Ca de ECMA5 puteți utiliza Obiect.defineProperty()
pentru a defini non-nenumărate proprietăți. De curent de compatibilitate are încă mult de dorit, dar acest lucru ar trebui să devină în cele din urmă utilizabil în toate browsere. (În special nota de curent incompatibilitate cu 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"]
Cu toate acestea, deoarece ECMA5 adăugat deja Obiect.tastele
s-ar putea folosi la fel de bine:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Răspuns inițial
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Edit: Deoarece acest răspuns a fost în jurul pentru un timp, am'll lăsa mai sus neatins. Oricine a citit acest lucru ar trebui să citiți, de asemenea, Ivan Nevostruev's de răspuns de mai jos.
Nu's nici o modalitate de a face prototip funcții non-enumerable care duce la ele întotdeauna de cotitură în pentru-în bucle pe care don't folosi hasOwnProperty`. Eu încă mai cred că acest răspuns ar fi ideal dacă extinderea prototip al Obiectului a fost't atât de murdar.
puteți folosi Obiect.tastele`
Object.keys(h)
Ai putea folosi Underscore.js, care este un Javascript utility library.
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
folosind jQuery puteți obține chei de genul asta:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]
Sau:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});
datorită @pimlottc
Am vrut sa folosesc top evaluat răspunsul de mai sus
Object.prototype.keys = function () ...
Cu toate acestea, atunci când se utilizează în combinație cu google maps API v3, google maps este non-funcționale.
for (var key in h) ...
funcționează bine.
dacă vă sunt încercarea de a obține elemente, dar numai nu la funcții apoi acest cod poate ajuta
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if( typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
acest lucru este parte din punerea în aplicare a HashMap și vreau doar cheile, "asta" este hashmap obiect care conține cheile