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

cette question a déjà une réponse ici:

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);
}
174
demandé sur Marcus Leon 2010-11-22 18:26:20

6 réponses

modifier: réponse périmée, ECMAScript 2015 (ES6) javascript standard a une mise en œuvre de carte, lire 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);
273
répondu Simen Echholt 2016-07-25 01:29:43

il suffit d'utiliser des objets simples:

var map = { key1: "value1", key2: "value2" }
function get(k){
  return map[k];
}
67
répondu Simon 2018-02-27 19:24:04
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
répondu Jade 2015-04-13 19:13:18

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

les réponses basées sur l'utilisation d'un objet comme HashMap sont cassées et peuvent causer 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 aux Chaînes en utilisant le .toString méthode. Cela peut conduire à la

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 cet objet se comporte de la même manière qu'une carte Java ici, vous seriez plutôt déçu de découvrir que la carte ne contient que un entrée avec la touche de chaîne [object Object] :

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

c'est clairement et non un remplacement pour le HashMap de Java. Curieusement, étant donné son âge, Javascript n'a pas actuellement d'objet de carte à usage 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 bien qu'un coup d'oeil à la table de compatibilité du navigateur montre que ce N'est pas encore prêt à être utilisé dans les applications web à usage général.

en attendant, le mieux que vous pouvez faire est:

  • utiliser délibérément des cordes comme clés. C'est-à-dire: utilisez des chaînes explicites comme des clés plutôt que de compter sur les .toString-ing de l'clés que vous utilisez.
  • assurez-vous que les objets que vous utilisez comme clés sont bien définis .méthode toString () qui convient à votre compréhension de l'unicité pour ces objets.
  • Si vous ne pouvez pas/ne veux pas changer .toString des objets clés, lors du stockage et de la récupération des entrées, convertissez les objets 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 voulez cartographier des données à partir, par exemple, D'objets File, il n'y a aucun moyen fiable de le faire parce que les attributs que l'objet File expose ne sont pas suffisants pour assurer son unicité. (Vous pouvez avoir deux objets de dossier qui représentent des dossiers différents sur le disque, mais il n'y a aucun moyen de distinguer entre eux dans JS dans le navigateur). Dans ces cas, malheureusement, tout ce que vous pouvez faire est de remanier votre code pour éliminer la nécessité de les stocker dans un mai; peut-être, en utilisant un tableau à la place et en les référencant exclusivement par index.

20
répondu Rich 2014-06-21 08:54:54
var map = {'myKey1':myObj1, 'mykey2':myObj2};
// You don't need any get function, just use
map['mykey1']
14
répondu David 2016-12-08 10:18:37

si vous n'êtes pas limité à JQuery, vous pouvez utiliser le prototype.js cadre. Il a une classe appelée Hash: vous pouvez même utiliser jQuery & prototype.js ensemble. Juste type 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
répondu polydor 2012-03-07 13:22:58