Obtention d'une liste de clés de tableau associatif


258

J'ai un tableau associatif en Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

Comment obtenir les clés de ce dictionnaire? c'est à dire que je veux

var keys = ["cats", "dogs"];

Modifier 7 ans plus tard: juste pour obtenir la terminologie correcte - il n'y a pas de «tableau associatif» en Javascript - c'est techniquement juste un objectet ce sont les clés d'objet que nous voulons.


Un moyen simple avec lodash JS - lodash.com/docs#keys
Programmeur chimique

Merci d'avoir clarifié la terminologie! Pouvez-vous peut-être l'agrandir un peu avec des lumières clignotantes rouges vives?
Joe Phillips

@Joe, j'en ferai le premier résultat dans Google lorsque j'en
aurai l'

Réponses:


84

Vous pouvez utiliser: Object.keys(obj)

Exemple:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Voir la référence ci-dessous pour la prise en charge du navigateur. Il est pris en charge dans Firefox 4.20, Chrome 5, IE9. Le lien ci-dessous contient un extrait de code que vous pouvez ajouter s'il Object.keys()n'est pas pris en charge dans votre navigateur.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


Je passe maintenant à la réponse acceptée. Seul IE8 ne le prend plus en charge (pour lequel un polyfill est disponible developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver

382

Essaye ça:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyest nécessaire car il est possible d'insérer des clés dans l'objet prototype de dictionary. Mais vous ne voulez généralement pas que ces clés soient incluses dans votre liste.

Par exemple, si vous procédez ainsi:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

puis faites une for...inboucle dictionary, vous obtiendrez aet b, mais vous obtiendrez également c.


Pas besoin de déclarer "var keys = []", sauf si vous devez l'utiliser après la boucle.
mzalazar

2
@mzalazar, vous feriez mieux de le faire ou ce sera une variable globale, ce qui est une mauvaise pratique.
b00t

@ b00t je pensais qu'en déclarant une variable à l'intérieur d'une boucle for ... elle ne serait pas définie dans l'espace global ... maintenant tu m'as fait douter hehe :)
mzalazar

2
@mzalazar, mais vous ne le déclarez ( clés ) à aucun moment si vous utilisez simplement keys.push(key);. Vous êtes juste en train de tirer (et donc de le déclarer) de l'espace de noms global. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

C'est la déclaration for..in .


1
Je viens de remarquer qu'il devrait y avoir un deux-points au lieu d'une virgule entre "chiens" et le tableau ci-dessus. Supposons que cela soit dû à la transcription.
wombleton

68
Très important à vérifier dictionary.hasOwnProperty(key)sinon vous risquez de vous retrouver avec des méthodes de la chaîne prototype.
Tigraine

4
Du même article: Itère sur les propriétés énumérables d'un objet, dans un ordre arbitraire . Si l'ordre des clés est important, vous devez faire quelque chose comme les pousser dans un tableau, le trier, puis utiliser une boucle for () pour obtenir les clés du tableau trié avec lesquelles indexer l'objet d'origine.
mcmlxxxvi

1
Il est, bien sûr, juste d'optimiser en omettant le dictionnaire.hasOwnProperty vérifier si vous pouvez être sûr que l'objet n'a pas de prototype. Mais il est important d'être conscient de la possibilité d'héritage de prototype dans ce contexte, car les dictionnaires JavaScript sont vraiment des objets.
fixermark

16

Juste une note rapide, méfiez-vous d'utiliser for..in si vous utilisez une bibliothèque (jQuery, prototype, etc.), car la plupart d'entre eux ajoutent des méthodes aux objets créés (y compris les dictionnaires).

Cela signifie que lorsque vous les parcourez, les noms des méthodes apparaissent sous forme de clés. Si vous utilisez une bibliothèque, consultez la documentation et recherchez une section énumérable, où vous trouverez les bonnes méthodes pour l'itération de vos objets.


3

Manière JQUERY simple.

C'est ce que j'utilise
DictionaryObj étant l'objet dictionnaire javascript que vous souhaitez parcourir. valeur, la clé étant bien sûr leur nom dans le dictionnaire.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
cela nécessite jQuery (ce qui est bien) mais vous avez oublié de le mentionner :-)
Simon_Weaver

@Exzile Les noms d'argument dans votre définition de fonction sont très déroutants. Il indique sur api.jquery.com/jquery.each que le rappel est Function (String propertyName, Object valueOfProperty). Vos noms impliquent l'inverse.
Chris

@Chris je mettrai à jour cela pour vous. Merci d'avoir fait remarquer cela.
Exzile

0

J'utilise actuellement la réponse de Rob de la Cruz

Object.keys(obj)

et dans un fichier chargé au début, j'ai quelques lignes de code empruntées ailleurs sur Internet qui couvrent le cas des anciennes versions d'interpréteurs de scripts qui n'ont pas de Object.keys intégré.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Je pense que c'est le meilleur des deux mondes pour les grands projets: code moderne simple et support rétrocompatible pour les anciennes versions de navigateurs, etc.

En effet, il met la solution de JW dans la fonction lorsque les Object.keys (obj) de Rob de la Cruz ne sont pas nativement disponibles.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.