Как создать простую карту с помощью JavaScript/JQuery

Как вы можете создать эквивалент JavaScript/JQuery этого 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);
}

Ответ 1

Изменить: устаревший ответ, стандартный код javascript ECMAScript 2015 (ES6) имеет реализацию карты, читайте здесь для получения дополнительной информации: 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);

Ответ 2

Просто используйте простые объекты:

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

Ответ 3

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;
    };
}

Ответ 4

Это старый вопрос, но поскольку существующие ответы могут быть очень опасными, я хотел оставить этот ответ для будущих людей, которые могли бы споткнуться здесь...

Ответы, основанные на использовании объекта как HashMap, нарушены и могут вызвать крайне неприятные последствия, если вы используете в качестве ключа ничего, кроме строки. Проблема в том, что свойства Object принудительно применяются к строкам с использованием метода .toString. Это может привести к следующей гадости:

function MyObject(name) {
  this.name = name;
};
var key1 = new MyObject("one");
var key2 = new MyObject("two");

var map = {};
map[key1] = 1;
map[key2] = 2;

Если бы вы ожидали, что объект будет вести себя так же, как и Java-карта здесь, вам будет довольно неприятно обнаружить, что карта содержит только одну запись со строковым ключом [object Object]:

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

Это явно не замена Java HashMap. Необычно, учитывая возраст, Javascript в настоящее время не имеет объект общей цели. Однако на горизонте есть надежда: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map, хотя взгляд на таблицу совместимости браузера показывает, что она не готова к использованию в общедоступных веб-приложениях пока.

Тем временем самое лучшее, что вы можете сделать:

  • Умышленно используйте клавиши "Строки". То есть используйте явные строки как ключи, а не полагайтесь на неявное .toString-ing используемых вами ключей.
  • Убедитесь, что объекты, которые вы используете в качестве ключей, имеют четко определенный метод .toString(), который соответствует вашему пониманию уникальности для этих объектов.
  • Если вы не можете/не хотите изменять .toString ключевых объектов, при хранении и извлечении записей, преобразуйте объекты в строку, которая представляет ваше понимание уникальности. Например. map[toUniqueString(key1)] = 1

Иногда, однако, это невозможно. Если вы хотите сопоставить данные на основе, например, с объектами File, надежного способа сделать это невозможно, поскольку атрибуты, которые предоставляет объект File, недостаточно для обеспечения его уникальности. (Возможно, у вас есть два объекта File, которые представляют разные файлы на диске, но нет способа различать их в JS в браузере). В этих случаях, к сожалению, все, что вы можете сделать, это реорганизовать ваш код, чтобы исключить необходимость их хранения в банке; возможно, используя массив и ссылаясь на них исключительно по индексу.

Ответ 5

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

Ответ 6

Если вы не ограничены JQuery, вы можете использовать оболочку prototype.js. У него есть класс под названием Hash: вы можете использовать JQuery и prototype.js вместе. Просто введите 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