has*_*sen 29 javascript dictionary tuples
我有一种情况,我想创建从元组到整数的映射.在python中,我只是使用元组(a,b)作为字典的键,
Javascript有元组吗?我发现(a,b)在javascript中作为表达式只返回b(最后一项).显然这是从C继承的.
所以,作为一种解决方法,我认为我可以使用数组,
my_map[[a,b]] = c
Run Code Online (Sandbox Code Playgroud)
我在Firebug控制台试了一下它似乎工作.这是一个很好的方法吗?
我想到的另一种选择是从元组中创建一个字符串
my_map[""+a+":"+b] = c
Run Code Online (Sandbox Code Playgroud)
所以问题是:这些方法有什么问题吗?有没有更好的办法?
小澄清:在我的情况下,a,b,c都是整数
oll*_*iej 20
EcmaScript不区分按名称或通过[]例如索引属性.
a.name
Run Code Online (Sandbox Code Playgroud)
字面上相当于
a["name"]
Run Code Online (Sandbox Code Playgroud)
唯一的区别是数字等在命名属性访问中不是有效的语法
a.1
a.true
Run Code Online (Sandbox Code Playgroud)
等等都是无效的语法.
所有这些索引机制相同的原因是因为在EcmaScript中所有属性名称都是字符串.例如.
a[1]
Run Code Online (Sandbox Code Playgroud)
被有效地解释为
a[String(1)]
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您的意思是:
my_map[[a,b]] = c
Run Code Online (Sandbox Code Playgroud)
哪个成了
my_map[String([a,b])] = c
Run Code Online (Sandbox Code Playgroud)
这与您的第二个示例基本相同(取决于实现,它可能会更快).
如果你想要真正的价值关联查找,你需要在js语言之上自己实现它,你将失去漂亮的[]样式访问:-(
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 */
};
Run Code Online (Sandbox Code Playgroud)
您可以使用我的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] ) );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25945 次 |
| 最近记录: |