是否存在传递复合键的语法,即列表和对象,
如下面的例子,还是那个按设计?
> obj = {[1, 2]: 3};
SyntaxError: Unexpected token [
第二个例子工作正常,但不错,但我想知道是否有另一种方式。
> obj = {};
> obj[[1, 2]] = 3;
3
> [1, 2] in obj;
> true
答案 0 :(得分:11)
对象属性名称最后只是字符串,您的第二个示例似乎有效,因为括号属性访问器将[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]
保留为数组。