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.

Simon_Weaver
la source
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

Rob de la Cruz
la source
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.

JW.
la source
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 .

wombleton
la source
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.

Jesse
la source
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));
        });
Exzile
la source
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.

Ivan
la source