有没有像Python的JavaScript字典?

我需要像这样在javascript中创build一个字典

我不记得确切的符号,但它是这样的:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ } 

有没有这样的事情在JavaScript?

这是一个旧的post,但我想我应该提供一个说明的答案无论如何。

使用JavaScript的对象符号。 像这样:

 states_dictionary={ "CT":["alex","harry"], "AK":["liza","alex"], "TX":["fred", "harry"] }; 

并访问这些值:

 states_dictionary.AK[0] //which is liza 

或者您可以使用JavaScript文字对象表示法,而不需要使用引号:

 states_dictionary={ CT:["alex","harry"], AK:["liza","alex"], TX:["fred", "harry"] }; 

Javascript中没有真正的关联数组。 你可以尝试使用对象:

 var x = new Object(); x["Key"] = "Value"; 

但是,使用对象不可能使用典型的数组属性或像array.length这样的方法。 至less可以在for-in-loop中访问“对象数组”。

在这里创build了一个简单的JS字典:

 function JSdict() { this.Keys = []; this.Values = []; } // Check if dictionary extensions aren't implemented yet. // Returns value of a key if (!JSdict.prototype.getVal) { JSdict.prototype.getVal = function (key) { if (key == null) { return "Key cannot be null"; } for (var i = 0; i < this.Keys.length; i++) { if (this.Keys[i] == key) { return this.Values[i]; } } return "Key not found!"; } } // Check if dictionary extensions aren't implemented yet. // Updates value of a key if (!JSdict.prototype.update) { JSdict.prototype.update = function (key, val) { if (key == null || val == null) { return "Key or Value cannot be null"; } // Verify dict integrity before each operation if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; var flag = false; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { this.Values[i] = val; flag = true; break; } } if (!flag) { return "Key does not exist"; } } } // Check if dictionary extensions aren't implemented yet. // Adds a unique key value pair if (!JSdict.prototype.add) { JSdict.prototype.add = function (key, val) { // Allow only strings or numbers as keys if (typeof (key) == "number" || typeof (key) == "string") { if (key == null || val == null) { return "Key or Value cannot be null"; } if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { return "Duplicate keys not allowed!"; } } this.Keys.push(key); this.Values.push(val); } else { return "Only number or string can be key!"; } } } // Check if dictionary extensions aren't implemented yet. // Removes a key value pair if (!JSdict.prototype.remove) { JSdict.prototype.remove = function (key) { if (key == null) { return "Key cannot be null"; } if (keysLength != valsLength) { return "Dictionary inconsistent. Keys length don't match values!"; } var keysLength = this.Keys.length; var valsLength = this.Values.length; var flag = false; for (var i = 0; i < keysLength; i++) { if (this.Keys[i] == key) { this.Keys.shift(key); this.Values.shift(this.Values[i]); flag = true; break; } } if (!flag) { return "Key does not exist"; } } } 

上面的实现现在可以用来模拟字典:

 var dict = new JSdict(); dict.add(1, "one") dict.add(1, "one more") "Duplicate keys not allowed!" dict.getVal(1) "one" dict.update(1, "onne") dict.getVal(1) "onne" dict.remove(1) dict.getVal(1) "Key not found!" 

这只是一个基本的模拟。 通过实现更好的运行时间algorithm,可以进一步优化O(nlogn)时间复杂度或甚至更低的工作时间。 像数组上的合并/快速sorting,然后是一些Bsearch查找。 我没有尝试或search关于在JS中映射哈希函数。

而且,JSdict obj的key和value可以变成私有variables来偷偷摸摸。

希望这可以帮助!

编辑>>在实现上述之后,我个人使用JS对象作为可用的开箱即用的关联数组。

不过 ,我想特别提一下两种实际certificate有用的方法,使其成为方便的散列表体验。

vizdict.hasOwnProperty(key) 删除dict [key]

阅读这篇文章作为这个实现/使用的一个很好的资源。 在JavaScript关联数组中dynamic创build键

谢谢!

我意识到这是一个古老的问题,但是当你search'javascript dictionaries'的时候它popup来了,所以我想补充一下上面的答案,在ECMAScript 6中已经引入了官方的Map对象,这是一个字典实现:

 var dict = new Map(); dict.set("foo", "bar"); //returns "bar" dict.get("foo"); 

与javascript的普通对象不同,它允许任何对象作为关键字:

 var foo = {}; var bar = {}; var dict = new Map(); dict.set(foo, "Foo"); dict.set(bar, "Bar"); //returns "Bar" dict.get(bar); //returns "Foo" dict.get(foo); //returns undefined, as {} !== foo and {} !== bar dict.get({}); 

使用JavaScript对象。 您可以像字典中的键一样访问它们的属性。 这是JSON的基础。 该语法与Python字典类似。 请参阅: JSON.org

一个老问题,但我最近需要做一个AS3> JS端口,为了提高速度,我为JS写了一个简单的AS3风格的Dictionary对象:

http://jsfiddle.net/MickMalone1983/VEpFf/2/

如果你不知道,AS3字典允许你使用任何对象作为键,而不仅仅是string。 一旦你find了他们的用途,他们会很方便。

它不如原生物体那样快,但在这方面我还没有发现任何重大的问题。

API:

 //Constructor var dict = new Dict(overwrite:Boolean); //If overwrite, allows over-writing of duplicate keys, //otherwise, will not add duplicate keys to dictionary. dict.put(key, value);//Add a pair dict.get(key);//Get value from key dict.remove(key);//Remove pair by key dict.clearAll(value);//Remove all pairs with this value dict.iterate(function(key, value){//Send all pairs as arguments to this function: console.log(key+' is key for '+value); }); dict.get(key);//Get value from key 

Firefox 13+提供了类似于python中的dict对象的map对象的实验性实现。 规格在这里 。

它只在Firefox中可用,但它比使用new Object()属性看起来更好。 从文档引用:

  • 一个对象有一个原型,所以在地图上有默认的键。 但是,这可以绕过使用map = Object.create(null)
  • Object的键是Strings ,它们可以是Map任何值。
  • 您可以轻松获取Map的大小,而您必须手动跟踪Object的大小。