34

我有一种情况,我想创建从元组到整数的映射。在 python 中,我会简单地使用一个元组(a,b)作为字典的键,

Javascript 有元组吗?我发现(a,b)在 javascript 中作为表达式只返回 b (最后一项)。显然这是从 C 继承的。

所以,作为一种解决方法,我想我可以使用数组来代替,

my_map[[a,b]] = c

我在 Firebug 控制台上尝试过,它似乎可以工作。这是一个好方法吗?

我想到的另一种选择是从元组中创建一个字符串

my_map[""+a+":"+b] = c

所以问题是:这些方法有什么问题吗?有没有更好的办法?

编辑:

小说明:在我的例子中,a,b,c 都是整数

4

4 回答 4

23

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

于 2009-09-15T05:13:06.577 回答
7

您可以使用我的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] ) );
于 2009-09-15T09:00:35.620 回答
4

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 */
};
于 2009-09-15T05:17:23.870 回答
0

实现类似功能的最简单和“自然”的方法是使用多维数组,如下所示:

var my_map = [["blah","blah","bla"],
              ["foo", "bla", 8],
              [324, 2345, 235],
              [true, false, "whatever..."]];
于 2012-02-04T23:29:33.620 回答