Javascript:使用元组作为字典键

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语言之上自己实现它,你将失去漂亮的[]样式访问:-(

  • 虽然技术上是正确的,但我想警告不要实际使用语法 `a[1]`,因为它看起来太像数组解引用,如果有问题的对象实际上是 `Array` 的一个实例,那么你会在脚。 (2认同)
  • 我只是说人们不应该将数字用作属性引用,除非他们特别打算通过索引访问数组成员。否则,代码将难以理解和混乱。示例:`var objA = {“ 1”:“ abc”,“ 3”:“ def”};`vs.`var objA = [“ abc”,undefined,“ def”];`?两者对`objA [1]`和'obj [3]`的回答都是相同的,但实际上只有一个是具有数组字段的数组,例如`push()`和`length`。 (2认同)

eye*_*ess 5

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)


Tim*_*own 5

您可以使用我的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)