Je sais que les objets javascript servent de hachage, 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 retourne, mais y a-t-il un moyen plus propre de le faire?
Je continue à penser que ce doit être une simple fonction intégrée qui m'a manqué mais je ne la trouve pas!
javascript
object
key
Tapoter
la source
la source
Réponses:
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 existe également un extrait de code de compatibilité descendante:
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; }
la source
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
rendrakeys
disponible à toutes les sous-classes d'objets, donc pour tous les objets. Ce que vous voudrez probablement si vous essayez d'utiliser la POO. Quoi qu'il en soit, cela dépend vraiment de vos besoins.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 shim pour garantir
Object.keys
dans les navigateurs plus anciens. Cependant, il est possible d'obtenir la fonctionnalité exacte demandée en utilisant la nouvelledefineProperty
fonctionnalité d' ECMA .À partir d'ECMAScript 5 - Object.defineProperty
Depuis ECMA5, vous pouvez utiliser
Object.defineProperty()
pour définir des propriétés non énumérables. La compatibilité actuelle a encore beaucoup à désirer, mais cela devrait éventuellement devenir utilisable dans tous les navigateurs. (Notez en particulier 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à été ajouté,
Object.keys
vous pouvez également 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; }
Edit: Puisque cette réponse existe depuis un certain temps, je laisserai ce qui précède intact. Quiconque lit ceci devrait également lire la réponse d'Ivan Nevostruev ci-dessous.
Il n'y a aucun moyen de rendre les fonctions de prototype non énumérables, ce qui les conduit toujours à apparaître dans des boucles d'entrée qui ne sont pas utilisées
hasOwnProperty
. Je pense toujours que cette réponse serait idéale si l'extension du prototype d'Object n'était pas si compliquée.la source
vous pouvez utiliser
Object.keys
Object.keys(h)
la source
Vous pouvez utiliser Underscore.js , qui est une bibliothèque utilitaire Javascript.
_.keys({one : 1, two : 2, three : 3}); // => ["one", "two", "three"]
la source
Object.prototype
_.keys(obj).length
pour voir s'il y a des clés.C'est le mieux que vous puissiez faire, pour autant que je sache ...
var keys = []; for (var k in h)keys.push(k);
la source
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 à @pimlottc
la source
JQuery.map
:$.map(h, function(v,k) { return k; });
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; }
la source
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.
la source
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 ne veux que les clés,
this
est l'objet hashmap qui contient les clésla source