C'est une vieille question, mais parce que les questions / réponses pourrait être très dangereux, je voulais sortir de cette réponse pour l'avenir des gens qui pourraient trébucher ici...
Les réponses basées sur l'utilisation d'un Objet comme une table de hachage sont brisés et peut causer extrêmement conséquences désagréables si vous utilisez autre chose qu'une Chaîne comme la clé. Le problème est que les propriétés de l'Objet sont contraints à faire des Cordes à l'aide de l' .méthode toString. Cela peut conduire à la suite de méchanceté:
function MyObject(name) {
this.name = name;
};
var key1 = new MyObject("one");
var key2 = new MyObject("two");
var map = {};
map[key1] = 1;
map[key2] = 2;
Si vous vous attendiez à cet Objet se comportent de la même manière qu'un Java Carte ici, vous serait plutôt furieux de découvrir que la carte ne contient une entrée avec la clé de Chaîne [object Object]
:
> JSON.stringify(map);
{"[object Object]": 2}
Ce n'est clairement pas un remplacement pour Java de la table de hachage. Bizarrement, étant donné que c'est l'âge, le Javascript n'a pas actuellement d'un usage général, la carte de l'objet. Il y a de l'espoir à l'horizon, si: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map bien qu'un coup d'œil sur le Navigateur de Compatibilité table, il n'y montrera que ce n'est pas prêt à les utiliser à des fins générales applications web encore.
Dans l'intervalle, le meilleur que vous pouvez faire est:
- Délibérément, l'utilisation de Chaînes que les clés. I. e. utiliser des chaînes de caractères comme des touches plutôt que de compter sur l'implicite .toString-ing de l'clés que vous utilisez.
- S'assurer que les objets que vous utilisez, car les touches sont bien définis .méthode toString() qui convient le mieux à votre compréhension de l'unicité de ces objets.
- Si vous ne pouvez pas/ne veux pas changer .toString de la clé des Objets, lorsque le stockage et la récupération des inscriptions, de convertir les objets d'une chaîne de caractères qui représente votre compréhension de l'unicité. E. g.
map[toUniqueString(key1)] = 1
Parfois, cependant, ce n'est pas possible. Si vous souhaitez mapper les données sur la base, par exemple les objets de Fichier, il n'y a aucun moyen fiable de le faire parce que les attributs que le Fichier d'objet expose ne sont pas assez pour assurer son unicité. (Vous pouvez avoir deux Fichier des objets qui représentent les différents fichiers sur le disque, mais il n'y a aucun moyen de les distinguer en JS dans le navigateur). Dans ces cas, malheureusement, tout ce que vous pouvez faire est de restructurer le code d'éliminer la nécessité pour les stocker dans un peut, peut-être, par l'utilisation d'un tableau à la place et le référencement exclusivement par l'index.