代码之家  ›  专栏  ›  技术社区  ›  hasen

javascript:使用元组作为字典键

  •  28
  • hasen  · 技术社区  · 15 年前

    在这种情况下,我想创建一个从元组到整数的映射。在python中,我只使用tuple (a,b) 作为字典的钥匙,

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

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

    my_map[[a,b]] = c
    

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

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

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

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

    编辑:

    小说明:在我的例子中,A、B、C都是整数。

    4 回复  |  直到 13 年前
        1
  •  20
  •   olliej    15 年前

    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[]样式的访问:-(

        2
  •  5
  •   Tim Down    13 年前

    你可以用我的 jshashtable 然后用任何对象作为键 假设您的元组是整数数组 我认为你最好的选择是你自己提到过的:使用 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] ) );
    
        3
  •  2
  •   eyelidlessness    15 年前

    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
  •  0
  •   Zelenova    13 年前

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

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