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
另见:
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的主要来源”——需要引用。