如何创建与此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);
}
答案 0 :(得分:283)
编辑:过期回答,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);
答案 1 :(得分:72)
只需使用普通对象:
var map = { key1: "value1", key2: "value2" }
function get(k){
return map[k];
}
答案 2 :(得分:23)
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;
};
}
答案 3 :(得分:21)
这是一个老问题,但由于现有的答案可能非常危险,我想留下这个答案给将来可能在这里绊倒的人......
基于使用Object作为HashMap的答案被破坏,如果您使用除String之外的任何东西作为键,则会导致极其恶劣的后果。问题是使用.toString方法将对象属性强制转换为Strings。这可能导致以下肮脏:
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虽然浏览一下浏览器兼容性表格,但我们还没有准备好在通用网络应用程序中使用它。
与此同时,您可以做的最好的事情是:
map[toUniqueString(key1)] = 1
但有时候,这是不可能的。如果要基于(例如File对象)映射数据,则没有可靠的方法来执行此操作,因为File对象公开的属性不足以确保其唯一性。 (您可能有两个File对象代表磁盘上的不同文件,但在浏览器中无法区分它们)。在这些情况下,不幸的是,您所能做的就是重构您的代码,以消除将这些存储在may中的需要;也许,通过使用数组而仅通过索引引用它们。
答案 4 :(得分:15)
var map = {'myKey1':myObj1, 'mykey2':myObj2};
// You don't need any get function, just use
map['mykey1']
答案 5 :(得分:5)
如果您不限于JQuery,则可以使用prototype.js框架。它有一个名为Hash的类:你甚至可以使用JQuery&amp; 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