web-dev-qa-db-fra.com

Comment créer une carte simple en utilisant JavaScript / JQuery

Comment créer l'équivalent JavaScript/JQuery 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);
}
184
Marcus Leon

Edit: Réponse obsolète, le code javascript standard d’ECMAScript 2015 (ES6) a une implémentation de Map, cliquez ici pour plus d’informations: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

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

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

//map[myKey1] == get(myKey1);
283
Simen Echholt

Il suffit d'utiliser des objets simples:

var map = { key1: "value1", key2: "value2" }
function get(k){
  return map[k];
}
74
Simon
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;
    };
}
23
Jade

C'est une vieille question, mais parce que les réponses existantes pourraient être très dangereuses, je voulais laisser cette réponse aux futurs gens qui pourraient trébucher ici ...

Les réponses basées sur l'utilisation d'un objet en tant que HashMap sont cassées et peuvent avoir des conséquences extrêmement désagréables si vous utilisez autre chose qu'une chaîne comme clé. Le problème est que les propriétés de l'objet sont contraintes à Strings à l'aide de la méthode .toString. Cela peut conduire à la méchanceté suivante:

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 à ce que Object se comporte de la même manière qu’une Java Map ici, vous seriez plutôt fâché de découvrir que la carte ne contient qu'une entrée avec la clé de chaîne [object Object]:

> JSON.stringify(map);
{"[object Object]": 2}

Ceci est clairement pas un remplacement pour HashMap de Java. Bizarrement, étant donné son âge, Javascript n’a pas d’objet cartographique général. Il y a de l'espoir à l'horizon, cependant: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map en jetant un coup d'œil au tableau de compatibilité du navigateur. montrera que ce n'est pas encore prêt à être utilisé dans les applications web d'usage général.

En attendant, le mieux que vous puissiez faire est de:

  • Utiliser délibérément des chaînes comme clés. C'est à dire. utilisez des chaînes explicites en tant que clés plutôt que de compter sur le .toString-ing implicite des clés que vous utilisez.
  • Assurez-vous que les objets que vous utilisez en tant que clés ont une méthode .toString () bien définie qui convient à votre compréhension de l'unicité de ces objets.
  • Si vous ne pouvez pas/ne voulez pas changer le .toString de la clé Objects, convertissez les objets lors de la mémorisation et de la récupération des entrées en une chaîne qui représente votre compréhension de l'unicité. Par exemple. map[toUniqueString(key1)] = 1

Parfois, cependant, ce n'est pas possible. Si vous souhaitez mapper des données en fonction, par exemple, d'objets File, il n'existe aucun moyen fiable de le faire, car les attributs exposés par l'objet File ne suffisent pas pour garantir son unicité. (Vous pouvez avoir deux objets File qui représentent différents fichiers sur le disque, mais il n’ya aucun moyen de les distinguer dans JS dans le navigateur). Dans ces cas, malheureusement, tout ce que vous pouvez faire est de refactoriser votre code pour éliminer le besoin de les stocker dans une boîte aux lettres. peut-être, en utilisant plutôt un tableau et en les référençant exclusivement par index.

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

Si vous n'êtes pas limité à JQuery, vous pouvez utiliser le framework prototype.js. Il a une classe appelée Hash: vous pouvez même utiliser JQuery & prototype.js ensemble. Il suffit de taper jQuery.noConflict ();

var h = new Hash();
h.set("key", "value");
h.get("key");
h.keys(); // returns an array of keys
h.values(); // returns an array of values
5
polydor