在Javascript中,如何使用object作为hashmap的键?

在Javascript中,如何使用object作为hashmap的键?,javascript,web,Javascript,Web,这是REPL中的结果 >>a1={1:2} Object {1: 2} >>a2={1:4} Object {1: 4} >>c={} Object {} >>c[a1]=2 2 >>c[a2] 2 可以看出,a1和a2是不同的对象。但是,c[a1]和c[a2]将得到相同的结果。有没有办法将object用作hashmap的键?您可以将object转换为字符串。javascript对象中的键类型应为字符串 属性名称必须是字符串。这意味着

这是REPL中的结果

>>a1={1:2}
Object {1: 2}
>>a2={1:4}
Object {1: 4}
>>c={}
Object {}
>>c[a1]=2
2
>>c[a2]
2

可以看出,
a1
a2
是不同的对象。但是,
c[a1]
c[a2]
将得到相同的结果。有没有办法将object用作hashmap的键?

您可以将object转换为字符串。javascript对象中的键类型应为字符串

属性名称必须是字符串。这意味着非字符串对象 不能用作对象中的键。任何非字符串对象,包括 数字,通过toString方法键入到字符串中

您可以在上面的链接中找到相同的示例

c[<some_func_to_convert_obj_to_string(a1)>]=2
c[]=2

因此,如果要将该对象用作键,则需要将该对象转换为唯一字符串。。这里有很多答案。正如Steven Wexler指出的,JSON.stringify是不确定的,最好不要使用它。我不会再次复制这些函数,因为有一个专门的SO问题

只有字符串可以用作对象键。您可以使用hacky路径,使用
JSON.stringify()
将对象转换为字符串,但最好使用实际的hashmap

您可以使用它的自定义实现,或者如果您的目标环境支持它,则可以使用

还有一个用于WeakMap的垫片,您可以在尚不支持它的环境中使用:


使用JSON.stringify创建密钥可能很危险,因为JSON.stringify不是确定性的。@StevenWexler或OP希望使用对象作为密钥。。。应该将其转换为字符串,以便该字符串仅映射到此对象。。。下面的语句有一个SO-qsn:
JSON.stringify(myObj)==JSON.stringify(myObj)
并不总是正确的,因为JSON.stringify不是确定性的。因此,可以使用JSON.stringify从对象创建字符串。但把这些字符串用作键是危险的。@StevenWexler Ohh ohk。。。我不是说他应该使用JSON.stringify。。。如前所述,除了JSON.stringify之外,还有其他方法可以将对象转换为唯一字符串,并且有一个SO qsn用于此…我希望此链接可以帮助您