Disons 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 me retrouver avec des "clés" variables telles que:
keys == ["ircEvent", "method", "regex"]
javascript
johnstok
la source
la source
_.keys(myJSONObject)
Réponses:
Dans les navigateurs modernes (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +), vous pouvez utiliser la méthode Object.keys intégrée :
Ce qui précède a un polyfill complet mais une version simplifiée est:
Remplacez également
var getKeys
parObject.prototype.keys
pour vous permettre d'appeler.keys()
n'importe quel objet. L'extension du prototype a des effets secondaires et je ne recommanderais pas de le faire.la source
for (var key in myObject) {...}
technique est utile pour les exécutions javascript en dehors des navigateurs et V8. Par exemple, lors du passage de requêtes javascript map-reduction dans Riak, l'Object
objet n'existe pas, donc laObject.keys
méthode n'est pas disponible.Object.keys
méthode (ECMAScript 5.1) ne renvoie que les propres propriétés de l'objet. Je le vois comme une distinction importante.Comme l'a souligné slashnick , vous pouvez utiliser la construction "for in" pour parcourir un objet pour ses noms d'attribut. Cependant, vous itérerez sur tous les noms d'attributs de la chaîne de prototypes de l'objet. Si vous souhaitez itérer uniquement sur les propres attributs de l'objet, vous pouvez utiliser la méthode Object # hasOwnProperty () . Ayant ainsi les éléments suivants.
la source
esc
clé enfoncée car l'objet avait environ un million de propriétés, la plupart d'entre elles non utilisées, et j'avais une alerte à ce sujet.Comme Sam Dutton a répondu, une nouvelle méthode à cet effet a été introduite dans ECMAScript 5e é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 implémenter très facilement la méthode dans les navigateurs qui ne la prennent pas en charge. Cependant, certaines implémentations ne sont pas entièrement compatibles avec Internet Explorer. Voici une solution plus compatible:
Notez que la réponse actuellement acceptée n'inclut pas une vérification de hasOwnProperty () et renverra des propriétés héritées de la chaîne de prototype. Il ne prend pas non plus en compte le célèbre bogue DontEnum dans Internet Explorer où les propriétés non énumérables sur la chaîne de prototypes font en sorte que les propriétés déclarées localement avec le même nom héritent de leur attribut DontEnum.
L'implémentation d' Object.keys () vous donnera une solution plus robuste.
EDIT: suite à une récente discussion avec kangax , un contributeur bien connu de Prototype, j'ai implémenté la solution de contournement pour le bogue DontEnum basée sur le code de sa
Object.forIn()
fonction trouvée ici .la source
Object.prototype
. Il est souvent le cas, cependant, que le code plus court semble beaucoup plus attrayant que le code plus grand et plus robuste, mais le but de cette réponse est d'utiliser ECMAScript 5thObject.keys()
, qui peut être implémenté dans les navigateurs qui ne le prennent pas en charge en utilisant ce code. La version native serait encore plus performante que cela.Object.keys
ne renvoie qu'un tableau de chaînes correspondant aux propriétés énumérables d'un objet. Cela peut ne pas être crucial lorsque vous travaillez avec des objets natifs (définis par l'utilisateur), mais devrait être très visible avec les objets hôtes (bien que le comportement des objets hôtes non spécifiés soit une histoire distincte - douloureuse). Pour énumérer TOUTES les propriétés (y compris non énumérables), ES5 fournitObject.getOwnPropertyNames
(voir son support dans ma table compat. - kangax.github.com/es5-compat-table )Object.keys(stuff)
et nonstuff.keys()
?Notez que Object.keys et d'autres méthodes ECMAScript 5 sont pris en charge par Firefox 4, Chrome 6, Safari 5, IE 9 et supérieur.
Par exemple:
Tableau de compatibilité ECMAScript 5: http://kangax.github.com/es5-compat-table/
Description des nouvelles méthodes: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
la source
Object.getOwnPropertyNames(obj)
Cette fonction affiche également des propriétés non énumérables en plus de celles indiquées par
Object.keys(obj)
.Dans JS, chaque propriété a quelques propriétés, y compris un booléen
enumerable
.En général, les propriétés non énumérables sont plus «internes» et moins souvent utilisées, mais il est parfois judicieux de les examiner pour voir ce qui se passe réellement.
Exemple:
Notez également comment:
Object.getOwnPropertyNames
etObject.keys
ne remontez pas la chaîne du prototype pour trouverbase
for in
Est-ce quePlus d'informations sur la chaîne de prototypes ici: https://stackoverflow.com/a/23877420/895245
la source
Je suis un grand fan de la fonction de vidage.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
la source
https://j11y.io/demos/prettyprint/
?Pourrait le faire avec jQuery comme suit:
la source
si vous essayez d'obtenir uniquement les éléments mais pas les fonctions, ce code peut vous aider
cela fait partie de mon implémentation du HashMap et je veux seulement les clés, "ceci" est l'objet hashmap qui contient les clés
la source
Cela fonctionnera dans la plupart des navigateurs, même dans IE8, et aucune bibliothèque d'aucune sorte n'est requise. var i est votre clé.
la source
Sous les navigateurs prenant en charge js 1.8:
la source
Mozilla a des détails d'implémentation complets sur la façon de le faire dans un navigateur où il n'est pas pris en charge, si cela aide:
Vous pouvez l'inclure comme vous le souhaitez, mais éventuellement dans une sorte de
extensions.js
fichier en haut de votre pile de scripts.la source
Utilisation
Reflect.ownKeys()
Object.keys et Object.getOwnPropertyNames ne peuvent pas obtenir de propriétés non énumérables . Cela fonctionne même pour les propriétés non énumérables .
la source
IE ne prend pas en charge (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 effectue un filtrage stupide.
La liste est disponible au bas de ce message de groupe Google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
la source
Puisque j'utilise underscore.js dans presque tous les projets, j'utiliserais la
keys
fonction:La sortie de cela sera:
la source
S'appuyant sur la réponse acceptée.
Si l'objet a des propriétés que vous voulez appeler, dites .properties () essayez!
la source
La solution fonctionne sur mes coques et cross-browser:
la source