【问题标题】:Syntax for creating objects with composite keys in JavaScript在 JavaScript 中使用复合键创建对象的语法
【发布时间】:2011-09-16 15:01:12
【问题描述】:

是否有传递复合键的语法,即列表和对象,
像下面的例子,还是设计使然?

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

第二个例子运行良好,还不错,但我想知道是否有其他方法。

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

【问题讨论】:

  • 为什么需要复合键?
  • @NT3RP,SQL 结果将被加载到 JavaScript 对象并且需要复合键。

标签: javascript composite-key


【解决方案1】:

Object property names 在 JavaScript 中最后只是字符串,您的第二个示例似乎有效,因为括号属性访问器将 [1, 2] 表达式转换为 String(返回 "1,2"),例如:

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

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

另一个例子:

var foo = { toString: function () { return "bar"; } },
    obj = {};

obj[foo] = 3; // foo is converted to String ("bar")
console.log(obj["bar"]); // 3

另见:

【讨论】:

  • 所以对象被转换成字符串,显然我不知道
  • 我认为你应该添加一些东西来实际回答这个问题,他希望能够使用文字对象。 OP 可以使用a = {"1,2": hello},然后使用 [[1,2]] 访问它,看起来很奇怪,但 OP 想要做的是
  • @Nick Dandoulakis:是的,即使数组也是由字符串键入的。试试这个var arr = ["Hello","World"]; alert(arr["1"]);jsfiddle.net/mendesjuan/27Z4u
  • @CMS, @Juan:我可以使用字符串作为键,因为 JavaScript 不支持我想要的,而上面指向 jshashtable 的链接似乎很有趣。我得测试一下。
  • jshashtable 看起来不错,注意它基于严格相等,所以看起来相同的两个对象不会映射到同一个对象。为了最好的哈希表实现,你需要为你的对象实现一个 equals 和一个 hashCode 方法,就像 Java 一样
【解决方案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]
      }
    }
  }
}

【讨论】:

    【解决方案3】:

    您需要将[1, 2] 保留为数组吗?这究竟能让你做什么?我不熟悉“复合键”,所以也许一个简短的解释链接到一个澄清会帮助我更好地理解你的问题。

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

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

    但同样,我假设您希望将 [1, 2] 保留为数组。

    【讨论】:

    • 对于要用作键的对象,每个对象都必须实现 hashCode 方法,如 Java。由于 hashCode 是 bug 的一大来源,JavaScript 只能按字符串键
    • @JuanMendes re:“因为 hashCode 是 bug 的一大来源” - 需要引用。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2014-03-26
    • 1970-01-01
    • 2017-05-27
    • 2020-03-19
    • 2021-07-15
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多