Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中使用复合键创建对象的语法_Javascript_Composite Key - Fatal编程技术网

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

JavaScript中使用复合键创建对象的语法,javascript,composite-key,Javascript,Composite Key,是否有用于传递复合键(即列表和对象)的语法, 就像下面的例子,还是设计的 > obj = {[1, 2]: 3}; SyntaxError: Unexpected token [ 第二个例子很好,还不错,但我想知道是否有其他方法 > obj = {}; > obj[[1, 2]] = 3; 3 > [1, 2] in obj; > true 是否需要将[1,2]作为数组保留?这到底能让你做什么?我不熟悉“复合键”,所以也许一个简短的解释可以帮助我更好地理解你的问

是否有用于传递复合键(即列表和对象)的语法,
就像下面的例子,还是设计的

> obj = {[1, 2]: 3};
SyntaxError: Unexpected token [
第二个例子很好,还不错,但我想知道是否有其他方法

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

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

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

var obj = {  
  "[1, 2]": 3
}
但是,我再次假设您希望将
[1,2]
作为一个数组。

JavaScript中的对象属性名称最后只是字符串,您的第二个示例似乎有效,因为括号属性访问器将
[1,2]
表达式转换为
字符串
(返回
“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
另一个例子:

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
另见:


如果不想进行字符串连接,可以使用嵌套映射,然后使用包装器使代码不那么冗长。下面是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]
      }
    }
  }
}
类映射实现了Iterable{
只读mm=新映射()
get(a:Ka,b:Kb):V |未定义{
常数m=此.mm.get(a)
如果(m!==未定义){
返回m.get(b)
}
返回未定义
}
集合(a:Ka,b:Kb,v:v):无效{
设m=this.mm.get(a)
如果(m==未定义){
这个.mm.set(a,(m=newmap())
}
m、 组(b,v)
}
*[Symbol.iterator]():迭代器{
对于(本规范的常数[a,m]mm){
for(常数[b,v]m){
收益率[a,b,v]
}
}
}
}

为什么需要复合键?@NT3RP,SQL结果将加载到JavaScript对象,需要复合键。因此,对象被转换为字符串,显然我不知道我认为你应该添加一些东西来真正回答这个问题,他希望能够使用文字对象。OP可以使用
a={“1,2”:hello}
然后使用[[1,2]]访问它,看起来很奇怪,但这正是OP想要的do@NickDandoulakis:是的,甚至数组都是由字符串设置键的。试试这个
var-arr=[“你好”,“世界”];警报(arr[“1”])
@CMS,@Juan:我可以使用字符串作为键,因为JavaScript不支持我想要的内容,而且上面指向
jshashtable
的链接似乎很有趣。jshashtable看起来不错,注意它是基于严格相等的,所以看起来相同的两个对象不会映射到同一个对象。为了获得最佳的哈希表实现,您需要为您的对象实现一个equals和一个hashCode方法,就像Java一样。对于要用作键的对象,每个对象都必须实现一个hashCode方法,就像Java一样。由于hashCode是bug的一大来源,JavaScript只能通过strings@JuanMendes回复:“因为hashCode是bug的主要来源”——需要引用。