Comment lister les propriétés d'un objet JavaScript?
dire que je crée un objet ainsi:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Quelle est la meilleure façon de récupérer une liste des noms de propriété? c'est à dire que je voudrais terminer avec quelques variables clés " tels que:
keys == ["ircEvent", "method", "regex"]
16 réponses
dans les navigateurs modernes (IE9+, FF4+, Chrome5+, Opera12+, Safari5+), vous pouvez utiliser l'objet construit dans .clés méthode:
var keys = Object.keys(myObject);
le ci-dessus a un polyfill complet mais une version simplifiée est:
var getKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
remplacer var getKeys
par Object.prototype.keys
pour vous permettre d'appeler .keys()
sur n'importe quel objet. Étendre le prototype a des effets secondaires et je ne le recommande pas.
comme slashnick souligné, vous pouvez utiliser la construction "for in" pour itérer sur un objet pour ses noms d'attribut. Cependant, vous allez itérer sur tous les noms d'attribut dans la chaîne prototype de l'objet. Si vous voulez itérer seulement sur les propres attributs de l'objet, vous pouvez utiliser la méthode #objet # hasOwnProperty() . Donc les suivantes.
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
comme Sam Dutton a répondu, une nouvelle méthode pour ce but même a été introduite dans ECMAScript 5ème édition. Object.keys()
fera ce que vous voulez et est pris en charge dans Firefox 4 , Chrome 6, Safari 5 et IE 9 .
vous pouvez également très facilement mettre en œuvre la méthode dans les navigateurs qui ne le prennent pas en charge. Cependant, certaines implémentations ne sont pas entièrement compatibles avec Internet Explorer. j'ai détaillé ce sur mon blog et produit une solution plus compatible:
Object.keys = Object.keys || (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
return function (o) {
if (typeof o != "object" && typeof o != "function" || o === null)
throw new TypeError("Object.keys called on a non-object");
var result = [];
for (var name in o) {
if (hasOwnProperty.call(o, name))
result.push(name);
}
if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i]))
result.push(DontEnums[i]);
}
}
return result;
};
})();
notez que la réponse actuellement acceptée n'inclut pas une vérification pour hasOwnProperty () et retournera les propriétés héritées par la chaîne de prototypes. Il ne tient pas compte non plus du fameux bug DontEnum dans Internet Explorer où des propriétés non-dénombrables sur la chaîne prototype provoquent des propriétés déclarées localement avec le même nom à hériter de leur attribut DontEnum.
Mise En Œuvre Objet.keys () vous donnera une solution plus robuste.
EDIT: suite à une discussion récente avec kangax , un contributeur bien connu au Prototype, j'ai mis en œuvre la solution de contournement pour le bogue de DontEnum basé sur le code pour sa Object.forIn()
fonction trouvée ici .
Notez cet objet.les clés et autres méthodes ECMAScript 5 sont supportées par Firefox 4, Chrome 6, Safari 5, IE 9 et plus.
par exemple:
var o = {"foo": 1, "bar": 2};
alert(Object.keys(o));
ECMAScript 5 Tableau de compatibilité: http://kangax.github.com/es5-compat-table /
Description des nouvelles méthodes: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5 /
Object.getOwnPropertyNames(obj)
cette fonction présente également des propriétés non dénombrables en plus de celles indiquées par Object.keys(obj)
.
En JS, chaque propriété a un peu de propriétés, y compris un booléen enumerable
.
en général, les propriétés non dénombrables sont plus "internalistes" et moins souvent utilisées, mais c'est perspicace de les regarder parfois pour voir ce qui se passe réellement.
exemple:
var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})
console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]
console.log(Object.keys(o))
// [ 'yes' ]
for (var x in o)
console.log(x)
// yes, base
aussi noter comment:
-
Object.getOwnPropertyNames
etObject.keys
ne pas aller en haut de la chaîne de prototype pour trouverbase
-
for in
ne
pour en savoir plus sur la chaîne prototype, Cliquez ici: https://stackoverflow.com/a/23877420/895245
je suis un grand fan de la fonction dump.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
pourrait le faire avec jQuery comme suit:
var objectKeys = $.map(object, function(value, key) {
return key;
});
si vous essayez d'obtenir les éléments seulement mais pas les fonctions alors 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, "ceci" est l'objet hashmap qui contient les clés
cela fonctionnera dans la plupart des navigateurs, même dans IE8 , et aucune bibliothèque d'aucune sorte ne sont nécessaires. var i est ta clé.
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
Mozilla a full détails de mise en œuvre sur la façon de le faire dans un navigateur où il n'est pas pris en charge, si cela aide:
if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function (obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.push(prop);
}
if (hasDontEnumBug) {
for (var i=0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
}
}
return result;
};
})();
}
vous pouvez l'inclure comme vous le souhaitez, mais peut-être dans une sorte de fichier extensions.js
en haut de votre pile de scripts.
IE ne prend pas en charge for(i in obj) pour les propriétés natives. Voici une liste de tous les accessoires que j'ai pu trouver.
il semble que stackoverflow fasse un peu de filtrage stupide.
la liste est disponible en bas de ce message de groupe google:- https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
s'appuyant sur la accepté de répondre.
si l'objet a des propriétés que vous voulez appeler say .propriétés() essayer!
var keys = Object.keys(myJSONObject);
for (j=0; j < keys.length; j++) {
Object[keys[i]].properties();
}
La solution de travail sur mon cas et de la croix-navigateur:
var getKeys = function(obj) {
var type = typeof obj;
var isObjectType = type === 'function' || type === 'object' || !!obj;
// 1
if(isObjectType) {
return Object.keys(obj);
}
// 2
var keys = [];
for(var i in obj) {
if(obj.hasOwnProperty(i)) {
keys.push(i)
}
}
if(keys.length) {
return keys;
}
// 3 - bug for ie9 <
var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
if(hasEnumbug) {
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
var nonEnumIdx = nonEnumerableProps.length;
while (nonEnumIdx--) {
var prop = nonEnumerableProps[nonEnumIdx];
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
keys.push(prop);
}
}
}
return keys;
};
utiliser Reflect.ownKeys()
var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]
objet.touches et .getOwnPropertyNames ne peut pas obtenir propriétés non-dénombrables . Il fonctionne même pour Non-énumérable propriétés.
var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]