Cum de a găsi cheile de un hash?

Ș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!

Comentarii la întrebare (4)
Soluția

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;
}
Comentarii (5)

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 noudefineProperty` 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.

Comentarii (8)

puteți folosi Obiect.tastele`

Object.keys(h)
Comentarii (1)

Ai putea folosi Underscore.js, care este un Javascript utility library.

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

Acesta este cel mai bun puteți face, după câte știu eu...

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

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

Comentarii (1)

Cred că puteți bucla prin proprietățile obiectului folosind pentru/în, astfel încât ai putea face ceva de genul asta:

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

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.

Comentarii (0)

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

Comentarii (0)