如何使用 JavaScript/JQuery 创建一个简单的地图

IT技术 javascript jquery hashmap
2021-01-28 14:15:59

您如何创建与此 Java 代码等效的 JavaScript/JQuery:

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);
}
6个回答

编辑:过时的答案,ECMAScript 2015 (ES6) 标准 javascript 有一个 Map 实现,阅读此处了解更多信息: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);
更新了我的答案以使用 anew Object()而不是new Array()这篇文章
2021-03-25 14:15:59
@Shikha 最有效的方法就是放置 (key, null) 然后检查您的值是否为 null。否则,检查如何删除数组中的项目(使用 javascript 函数 splice)
2021-03-30 14:15:59
我们如何在这里提供根节点?
2021-04-02 14:15:59
这个答案现在已经过时了,因为 Map 现在确实存在(是的!),请阅读以下内容:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-07 14:15:59
我们如何从地图中删除键值支付者?
2021-04-11 14:15:59

只需使用普通对象:

var map = { key1: "value1", key2: "value2" }
function get(k){
  return map[k];
}
不应将键指定为字符串,即不带引号
2021-03-21 14:15:59
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;
    };
}
在入口函数,你应该像这样改变。entrys[i] = { key: this.keys[i], value: this.data[i] }; -> entrys[i] = { key: this.keys[i], value: this.data[this.keys[i]] }; ——
2021-03-15 14:15:59
this.data[key] = null不会删除该属性;它只是将其值设置为null. 你应该delete this.data[key]改用。
2021-03-23 14:15:59
@YoYoYonnY:我不知道柯里化与此有什么关系,但原型方法不会泄漏变量或具有可变范围。他们确实有一个后期绑定的this上下文,但这是一个没有问题的功能。
2021-03-26 14:15:59
至少,把所有这些方法放在原型上。
2021-04-01 14:15:59

这是一个老问题,但因为现有的答案可能非常危险,我想把这个答案留给未来可能会在这里绊倒的人......

基于将对象用作 HashMap 的答案已被破坏,如果您使用字符串以外的任何其他内容作为键,可能会导致极其恶劣的后果。问题是使用 .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;

如果您期望 Object 的行为方式与此处的 Java Map 相同,那么您会很生气地发现该映射仅包含一个带有 String 键的条目[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 中没有办法区分它们)。不幸的是,在这些情况下,您所能做的就是重构您的代码以消除将这些存储在可能中的需要;也许,通过使用数组代替并通过索引专门引用它们。

var map = {'myKey1':myObj1, 'mykey2':myObj2};
// You don't need any get function, just use
map['mykey1']
无论出于何种原因,我们也可以这样做:var myKey = "myKey1"然后var map = { [myKey] : myObj1}
2021-04-10 14:15:59