188 votes

Comment créer une carte simple à l'aide de JavaScript/JQuery

Comment pouvez-vous créer JavaScript/JQuery équivalent de ce code Java:

Map map = new HashMap(); //Doesn't not have to be a hash map, any key/value map is fine
map.put(myKey1, myObj1);
map.put(myKey2, myObj2); //Repeat n times

function Object get(k) {
    return map.get(k);
}

285voto

Simen Echholt Points 6354
var map = new Object(); // or var map = {};
map[myKey1] = myObj1;
map[myKey2] = myObj2;

function get(k) {
    return map[k];
}

//map[myKey1] == get(myKey1);

75voto

Simon Points 2274

Juste utiliser des objets simples:

var map = {"key1":"value1","key2":"value2"}
function get(k){
  return map[k];
}

23voto

Jade Points 111
function Map() {
this.keys = new Array();
this.data = new Object();

this.put = function(key, value) {
    if(this.data[key] == null){
        this.keys.push(key);
    }
    this.data[key] = value;
};

this.get = function(key) {
    return this.data[key];
};

this.remove = function(key) {
    this.keys.remove(key);
    this.data[key] = null;
};

this.each = function(fn){
    if(typeof fn != 'function'){
        return;
    }
    var len = this.keys.length;
    for(var i=0;i<len;i++){
        var k = this.keys[i];
        fn(k,this.data[k],i);
    }
};

this.entrys = function() {
    var len = this.keys.length;
    var entrys = new Array(len);
    for (var i = 0; i < len; i++) {
        entrys[i] = {
            key : this.keys[i],
            value : this.data[i]
        };
    }
    return entrys;
};

this.isEmpty = function() {
    return this.keys.length == 0;
};

this.size = function(){
    return this.keys.length;
};

}

21voto

Rich Points 46

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.

16voto

David Points 2413
var map = {'myKey1':myObj1, 'mykey2':myObj2};
// You don't need any get function
// just use
// map[[mykey1]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X