有没有像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有用的方法,使其成为方便的散列表体验。
viz : dict.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
的大小。