如何使用JavaScript / JQuery创build一个简单的地图
你如何创build这个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有一个地图的实现,阅读更多的信息在这里: 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]; }
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; }; }
这是一个古老的问题,但因为现有的答案可能是非常危险的,我想留下这个答案,未来的人可能会在这里绊倒…
基于使用Object作为HashMap的答案被破坏,并且如果使用String以外的其他任何东西作为关键字,可能会导致非常糟糕的后果。 问题是使用.toString方法将Object属性强制转换为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相同,那么你会发现map只包含一个 String key [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应用程序。
在此期间,你可以做的最好的是:
- 故意使用string作为键。 即使用明确的string作为键,而不是依赖所使用的键的隐式.toString。
- 确保你用作键的对象有一个定义良好的.toString()方法,它适合你理解这些对象的唯一性。
- 如果您不能/不想更改关键对象的.toString,则在存储和检索条目时,请将对象转换为表示您对唯一性的理解的string。 例如
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']
如果你不限于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