在JavaScript中使用复合键创建对象的语法

时间:2011-06-16 18:18:06

标签: javascript composite-key

是否存在传递复合键的语法,即列表和对象,
如下面的例子,还是那个按设计?

> obj = {[1, 2]: 3};
SyntaxError: Unexpected token [

第二个例子工作正常,但不错,但我想知道是否有另一种方式。

> obj = {};
> obj[[1, 2]] = 3;
3
> [1, 2] in obj;
> true

3 个答案:

答案 0 :(得分:11)

JavaScript中的

对象属性名称最后只是字符串,您的第二个示例似乎有效,因为括号属性访问器将[1, 2]表达式转换为String(返回{ {1}}),例如:

"1,2"

另一个例子:

var obj = {};
obj[[1, 2]] = 3;

console.log(obj["1,2"]); // 3

另见:

答案 1 :(得分:2)

如果您不想进行字符串连接,则可以使用嵌套映射,然后使用包装器使代码不太冗长。这是TypeScript中的示例。

class MapMap<Ka, Kb, V> implements Iterable<[Ka, Kb, V]> {
  readonly mm = new Map<Ka, Map<Kb, V>>()

  get(a: Ka, b: Kb): V | undefined {
    const m = this.mm.get(a)
    if (m !== undefined) {
      return m.get(b)
    }
    return undefined
  }

  set(a: Ka, b: Kb, v: V): void {
    let m = this.mm.get(a)
    if (m === undefined) {
      this.mm.set(a, (m = new Map()))
    }
    m.set(b, v)
  }

  *[Symbol.iterator](): Iterator<[Ka, Kb, V]> {
    for (const [a, m] of this.mm) {
      for (const [b, v] of m) {
        yield [a, b, v]
      }
    }
  }
}

答案 2 :(得分:1)

您是否需要将[1, 2]保存为数组?这究竟能让你做到什么?我不熟悉“复合键”,所以可能只需要一个简短的解释就可以帮助我更好地理解你的问题。

如果您只想使用[1, 2]作为键,则可以始终将其用作字符串:

var obj = {  
  "[1, 2]": 3
}

但是我再次假设您希望将[1, 2]保留为数组。