【问题标题】:Javascript: using tuples as dictionary keysJavascript:使用元组作为字典键
【发布时间】:2010-11-28 08:27:36
【问题描述】:

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

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

所以,作为一种解决方法,我想我可以改用数组,

my_map[[a,b]] = c

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

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

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

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

编辑:

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

【问题讨论】:

    标签: javascript dictionary tuples


    【解决方案1】:

    你可以使用我的jshashtable,然后使用任何对象作为键,虽然假设你的元组是整数数组我认为你最好的选择是你自己提到的:使用@ 987654322@ 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] ) );
    

    【讨论】:

      【解决方案2】:

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

      var my_map = [["blah","blah","bla"],
                    ["foo", "bla", 8],
                    [324, 2345, 235],
                    [true, false, "whatever..."]];
      

      【讨论】:

        【解决方案3】:

        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 */
        };
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 虽然在技术上是正确的,但我想警告不要实际使用语法 a[1],因为它看起来太像数组解引用,如果有问题的对象实际上是 Array 的实例,那么你' d 朝自己的脚开枪。
          • @Guss 对不起,你能解释得更好吗?我是 js 语言的新手,我不明白你的意思
          • 我只是说人们不应该使用数字作为属性引用,除非他们特别打算通过索引访问数组成员。否则,代码很难理解和混淆。示例:var objA = { "1": "abc", "3": "def" };var objA = [ "abc", undefined, "def" ]; ?两者对objA[1]obj[3] 的回答相同,但只有一个是真正具有数组字段的数组,例如push()length
          猜你喜欢
          • 2020-09-25
          • 2020-06-17
          • 2011-12-25
          • 2012-02-20
          • 2019-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-28
          相关资源
          最近更新 更多