Question

Je sais qu'en javascript, les objets servent également de hachages, mais je n'ai pas pu trouver de fonction intégrée pour obtenir les clés.

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

Je veux quelque chose comme

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

Il est simple d'écrire moi-même une fonction pour parcourir les éléments et ajouter les clés à un tableau que je renvoie, mais existe-t-il un moyen standard plus propre de le faire ?

J'ai toujours l'impression que ce doit être une simple fonction intégrée que j'ai manquée mais je ne la trouve pas !

Était-ce utile?

La solution

Il existe une fonction en JavaScript moderne (ECMAScript 5) appelée Object.keys effectuer cette opération :

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

Les détails de compatibilité peuvent être trouvés ici.

Sur le Site Mozilla il y a aussi un extrait pour la compatibilité ascendante :

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

Autres conseils

Pour le code de production nécessitant une grande compatibilité avec les navigateurs clients, je suggère toujours la réponse d'Ivan Nevostruev ci-dessus avec une cale pour garantir Object.keys dans les anciens navigateurs.Cependant, il est possible d'obtenir la fonctionnalité exacte demandée en utilisant le nouveau defineProperty fonctionnalité.

Depuis ECMAScript 5 - Object.defineProperty

Depuis ECMA5, vous pouvez utiliser Object.defineProperty() pour définir des propriétés non dénombrables.Le compatibilité actuelle a encore beaucoup à désirer, mais cela devrait à terme devenir utilisable dans tous les navigateurs.(Notez particulièrement l'incompatibilité actuelle avec 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"]

Cependant, puisque ECMA5 a déjà ajouté Object.keys tu pourrais aussi bien utiliser :

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

Réponse originale

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

Modifier: Puisque cette réponse existe depuis un certain temps, je ne toucherai pas à ce qui précède.Quiconque lit ceci devrait également lire la réponse d'Ivan Nevostruev ci-dessous.

Il n'y a aucun moyen de rendre les fonctions prototypes non dénombrables, ce qui les amène à toujours apparaître dans des boucles for-in qui n'utilisent pas hasOwnProperty.Je pense toujours que cette réponse serait idéale si l'extension du prototype d'Object n'était pas si compliquée.

vous pouvez utiliser Object.keys

Object.keys(h)

Vous pourriez utiliser Souligner.js, qui est une bibliothèque d'utilitaires Javascript.

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

C'est le mieux que vous puissiez faire, à ma connaissance...

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

en utilisant jQuery vous pouvez obtenir les clés comme ceci :

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

Ou:

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

merci à @pimllotc

Je pense que vous pouvez parcourir les propriétés de l'objet en utilisant for/in, vous pouvez donc faire quelque chose comme ceci :

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

Je voulais utiliser la réponse la mieux notée ci-dessus

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

Cependant, lors de l'utilisation en conjonction avec l'API Google Maps v3, Google Maps n'est pas fonctionnel.

for (var key in h) ...

fonctionne bien.

si vous essayez d'obtenir uniquement les éléments mais pas les fonctions, ce code peut vous aider

this.getKeys = function() {

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

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

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

}

cela fait partie de mon implémentation du HashMap et je veux seulement les clés, this est l'objet hashmap qui contient les clés

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top