这是一个老问题,但因为现有的答案是很危险的,我想离开这个答案谁可能绊倒这里未来的乡亲...
的基于使用Object作为HashMap的答案被破坏,并且如果您使用除String之外的其他任何内容作为关键字,则会导致极其恶劣的后果。问题是Object属性使用.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;
如果你期待的是对象竟然能做出同样的方式作为一个Java地图在这里,你会相当恼火地发现,地图仅包含一个条目以字符串键[object Object]
:
> JSON.stringify(map);
{"[object Object]": 2}
这显然是不为 Java的HashMap中的替代品。奇怪的是,鉴于它的年龄,Javascript目前没有通用的地图对象。尽管如此,尽管如此,浏览器兼容性表中的一览表显示,这还未准备好用于通用Web应用程序。
在此期间,你能做的最好的是:
- 故意用字符串作为键。即使用明确的字符串作为键,而不是依赖所使用的键的隐式.toString。
- 确保您用作键的对象有一个定义良好的.toString()方法,它适合您理解这些对象的唯一性。
- 如果您不能/不想更改关键对象的.toString,当存储和检索条目时,将对象转换为表示您对唯一性的理解的字符串。例如。
map[toUniqueString(key1)] = 1
虽然有时候这是不可能的。如果要基于File对象映射数据,则没有可靠的方法来执行此操作,因为File对象公开的属性不足以确保其唯一性。 (您可能有两个File对象代表磁盘上的不同文件,但在浏览器中无法在JS中区分它们)。不幸的是,在这些情况下,你所能做的只是重构你的代码以消除将这些存储在may中的需要;也许,通过使用一个数组来代替它们并且仅仅通过索引来引用它们。
更新了我的答案,使用`new Object()`而不是`new Array()`。请参阅[本文](http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/) – 2010-11-22 15:55:10
我们如何在这里提供根节点? – Krishnan 2011-06-15 20:28:38
我们如何从地图中移除关键值付款人? – 2013-01-29 05:37:33