我有一种情况,我想创建从元组到整数的映射.在python中,我只是使用元组(a,b)
作为字典的键,
Javascript有元组吗?我发现(a,b)
在javascript中作为表达式只返回b(最后一项).显然这是从C继承的.
所以,作为一种解决方法,我认为我可以使用数组,
my_map[[a,b]] = c
我在Firebug控制台试了一下它似乎工作.这是一个很好的方法吗?
我想到的另一种选择是从元组中创建一个字符串
my_map[""+a+":"+b] = c
所以问题是:这些方法有什么问题吗?有没有更好的办法?
小澄清:在我的情况下,a,b,c都是整数
EcmaScript不区分按名称或通过[]
例如索引属性.
a.name
字面上相当于
a["name"]
唯一的区别是数字等在命名属性访问中不是有效的语法
a.1 a.true
等等都是无效的语法.
所有这些索引机制相同的原因是因为在EcmaScript中所有属性名称都是字符串.例如.
a[1]
被有效地解释为
a[String(1)]
在您的示例中,您的意思是:
my_map[[a,b]] = c
哪个成了
my_map[String([a,b])] = c
这与您的第二个示例基本相同(取决于实现,它可能会更快).
如果你想要真正的价值关联查找,你需要在js语言之上自己实现它,你将失去漂亮的[]样式访问:-(
您可以使用我的jshashtable然后使用任何对象作为键,但假设您的元组是整数数组我认为您最好的选择是您自己提到的:使用join()
Array 的方法创建常规对象的属性名称.你可以非常简单地包装它:
function TupleDictionary() { this.dict = {}; } TupleDictionary.prototype = { tupleToString: function(tuple) { return tuple.join(","); }, put: function(tuple, val) { this.dict[ this.tupleToString(tuple) ] = val; }, get: function(tuple) { return this.dict[ this.tupleToString(tuple) ]; } }; var dict = new TupleDictionary(); dict.put( [1,2], "banana" ); alert( dict.get( [1,2] ) );