如何使用JavaScript/JQuery创建简单映射

如何使用JavaScript/JQuery创建简单映射,javascript,jquery,hashmap,Javascript,Jquery,Hashmap,如何创建此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); } 编辑:过时答案,E

如何创建此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);
}

编辑:过时答案,ECMAScript 2015(ES6)标准javascript有一个映射实现,请阅读此处了解更多信息:


只需使用普通对象:

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

如果不局限于JQuery,可以使用prototype.js框架。它有一个名为Hash的类:您甚至可以一起使用JQuery和prototype.js。只需键入jQuery.noConflict()

函数映射(){
this.keys=新数组();
this.data=新对象();
this.put=函数(键、值){
if(this.data[key]==null){
这个。键。按(键);
}
此.data[键]=值;
};
this.get=函数(键){
返回此.data[键];
};
this.remove=功能(键){
此。键。移除(键);
此.data[key]=null;
};
this.each=函数(fn){
if(fn的类型!=“功能”){
返回;
}
var len=this.keys.length;
对于(变量i=0;i
这是一个老问题,但由于现有的答案可能非常危险,我想把这个答案留给未来可能会在这里绊倒的人

基于使用对象作为哈希映射的答案是错误的,如果使用字符串以外的任何东西作为键,可能会导致极其恶劣的后果。问题是使用.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目前没有通用的映射对象。不过,希望就在眼前:尽管浏览一下浏览器兼容性表,就会发现它还没有准备好用于通用web应用程序

同时,你能做的最好的事情是:

  • 故意使用字符串作为键。也就是说,使用显式字符串作为键,而不是依赖于使用的键的隐式.toString
  • 确保用作键的对象具有定义良好的.toString()方法,该方法适合您对这些对象唯一性的理解
  • 如果您不能/不想更改键对象的.toString,则在存储和检索条目时,请将对象转换为表示您对唯一性理解的字符串。例如,
    map[toUniqueString(key1)]=1

然而,有时这是不可能的。如果要基于(例如)文件对象映射数据,则没有可靠的方法可以做到这一点,因为文件对象公开的属性不足以确保其唯一性。(您可能有两个文件对象代表磁盘上的不同文件,但在浏览器的JS中无法区分它们)。不幸的是,在这些情况下,您所能做的就是重构代码,以消除将这些代码存储在内存中的需要;也许,通过使用数组代替,并通过索引专门引用它们。

更新了我的答案,使用
新对象()
代替
新数组()
。看看我们如何在这里提供根节点?我们如何从映射中删除键值付款人?@Shikha最有效的方法就是放入(key,null),然后检查您的值是否为null。否则,请检查如何删除数组中的项(使用javascript函数拼接)。此答案现在已过期,因为Map现在确实存在(耶!),请阅读以下内容:至少,将所有这些方法放在原型上。@Adshi:
This.data[key]=null
不会删除该属性;它只是将其值设置为
null
。您应该使用
删除此项。改为使用数据[键]
。在输入功能中,您应该这样更改。entrys[i]={key:this.keys[i],value:this.data[i]};->entrys[i]={key:this.keys[i],value:this.data[this.keys[i]}-@Yoyonny:我不知道currying与此有什么关系,但原型方法不会泄漏变量或具有可变范围。它们确实有一个后期绑定的
上下文,但这不是一个问题。键不应该被指定为字符串,即没有引号。出于任何原因,我们也可以这样做:
var myKey=“myKey1”
然后
var map={[myKey]:myObj1}
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
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;
    };
}
function MyObject(name) {
  this.name = name;
};
var key1 = new MyObject("one");
var key2 = new MyObject("two");

var map = {};
map[key1] = 1;
map[key2] = 2;
> JSON.stringify(map);
{"[object Object]": 2}