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

如何创建与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);
}
514077 次浏览

编辑:过时的答案,ECMAScript 2015 (ES6)标准javascript有一个地图实现,阅读这里了解更多信息: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);

只使用普通对象:

var map = { key1: "value1", key2: "value2" }
function get(k){
return map[k];
}
var map = {'myKey1':myObj1, 'mykey2':myObj2};
// You don't need any get function, just use
map['mykey1']

如果你不局限于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
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;
};
}

这是一个老问题,但因为现有的答案可能非常危险,所以我想把这个答案留给未来可能无意中发现的人……

基于使用对象作为HashMap的答案是坏的,如果使用字符串以外的任何东西作为键,可能会导致极其恶劣的后果。问题是使用. tostring方法将Object属性强制转换为字符串。这会导致以下情况:

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相同,你会相当恼火地发现Map只包含一个项,字符串键[object Object]:

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

这显然是Java HashMap的的替代品。奇怪的是,考虑到它的年代久远,Javascript目前还没有一个通用的映射对象。尽管如此,还是有希望的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map尽管浏览一下浏览器兼容性表就会发现它还没有准备好用于通用的web应用程序。

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

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

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