我有一种情况,我想创建从元组到整数的映射。在python中,我只想使用元组(a,b)
作为字典的键,
Javascript是否有元组?我发现javascript中的(a,b)
作为表达式只返回b(最后一项)。显然这是继承自C。
因此,作为一种解决方法,我认为我可以使用数组,
my_map[[a,b]] = c
我在Firebug控制台上试了一下它似乎工作了。这是一个很好的方法吗?
我想到的另一个选择是从元组中创建一个字符串
my_map[""+a+":"+b] = c
所以问题是:这些方法有什么问题吗?还有更好的方法吗?
小澄清:就我而言,a,b,c都是整数
答案 0 :(得分:20)
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语言之上自己实现它,你将失去漂亮的[]样式访问: - (
答案 1 :(得分:5)
您可以使用我的jshashtable,然后使用任何对象作为键,但假设您的元组是整数数组我认为您最好的选择是您自己提到的:使用Array的join()
方法用于创建常规对象的属性名称。你可以非常简单地包装它:
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] ) );
答案 2 :(得分:2)
Javascript中的所有对象键都是字符串。使用my_map[[a,b]] = c
会在my_map
中生成一个密钥,该密钥是[a,b].toString()
:a.toString() + ',' + b.toString()
的结果。这实际上可能是合乎需要的(并且类似于您对a + ':' + b
的使用),但如果您的密钥包含分隔符(如果您使用数组作为键,则使用逗号,或者如果您使用冒号,则可能会遇到冲突)像你的例子中那样写下字符串。)
编辑:另一种方法是为关键引用保留一个单独的数组。例如:
var keys = [
[a,b],
[c,d]
];
var my_map = {
'keys[0]': /* Whatever [a,b] ought to be the key for */,
'keys[1]': /* Whatever [c,d] ought to be the key for */
};
答案 3 :(得分:0)
实现类似功能的最简单,最“自然”的方法是使用多维数组,如下所示:
var my_map = [["blah","blah","bla"],
["foo", "bla", 8],
[324, 2345, 235],
[true, false, "whatever..."]];