如何在Javascript中使用数组作为键?
我有一个关于python的简单示例:如何在Javascript中使用数组作为键?,javascript,Javascript,我有一个关于python的简单示例: programs = {} if not programs.has_key(( program, time )): programs[( program, time )] = 0 programs[( program, time )] = programs[( program, time )] + 1 如何在Javascript中使用数组作为键?Javascript键是字符串 您需要一个或一个自定义方法来将数组映射到其他对象。这对您有用吗 变
programs = {}
if not programs.has_key(( program, time )):
programs[( program, time )] = 0
programs[( program, time )] = programs[( program, time )] + 1
如何在Javascript中使用数组作为键?Javascript键是字符串
您需要一个或一个自定义方法来将数组映射到其他对象。这对您有用吗
变量ary={person1:'valerie',person2:'alex'};
for(输入ary){
文档。写入(键“
”)
}
document.write(ary['person2'],“
”)
这将“起作用”。(但我不推荐)
这是因为当您将数组[1,2,3]作为散列(映射/关联数组)键传递时,在执行散列查找之前,正在将其转换为字符串“1,2,3”。只要不需要两个相同值的不同数组映射到不同的散列值,它就应该适合您的需要
var c = [1,2,3]
// a[c] evaluates to 'hello' even though we never executed a[c] = 'hello'
// but b == c evaluates to false
// b & c are two separate objects with the same values, so when they
// get converted to a string for hashing, they return the same value from the hash
如前所述,如果要使用对象引用作为键,需要的不仅仅是标准JavaScript哈希
更新
根据@speedplane的评论:
我怀疑当您将数组传递到哈希键时,JS会调用数组上的toString()
。因此,您可以轻松地测试您实际将获得的密钥:
["x", "y", "z"].toString(); // 'x,y,z'
["x,y,z"].toString(); // 'x,y,z'
[1,2,3].toString(); // '1,2,3'
[1,2,'3'].toString(); // '1,2,3'
[[1],[2],[3]].toString(); // '1,2,3'
[["x",1], ["y",2], ["z",3]].toString(); // 'x,1,y,2,z,3'
所以,我再次建议你不要这样做,除非你真的明白发生了什么。即使这样,我也不会这么做。我已经编写了一个库,该库使用现代JavaScript强大地实现了这一点。与目前发布的其他答案不同,它不依赖于将值序列化为字符串,而是使用ES2015
Map
对象,可以接受任意值作为键
我将引用实现概述,以便在库因某种原因消失或您希望自己实现它时,将该方法保留下来:
维护Map
对象树。每棵树存储:
- 在内部声明的
键:树中该点的值(如果有)。符号下
保证唯一性,因此 用户提供的值可以覆盖此密钥符号
- 在它的所有其他键上:所有其他到目前为止从这棵树设置下一棵树
akmap.set(['a','b'],true)
上,内部树
结构会是什么样的-
'a':
[value]: undefined
'b':
[value]: true
在这之后执行akmap.set(['a'],'ok')
只会更改
路径在'a'
处的值:
'a':
[value]: 'okay'
'b':
[value]: true
要获取数组的值,请在读取时遍历数组
从树上删除相应的键。如果树
在任何一点上都是不存在的。最后,阅读内部声明的
[value]
符号从您已到达的树上移除
要删除数组的值,请执行相同的操作,但删除所有值
在[value]
-symbol键下,删除
如果它们的大小
为0,则执行递归步骤
为什么是一棵树?因为当多个阵列具有相同的 相同的前缀,这在现实世界中非常典型,用于工作 例如,使用文件路径
您的意思是要使用数组作为散列中的查找吗?根据
program
和time
的可能值,仅使用[program,time]
的字符串表示形式作为键可能没有问题。因为您用作属性的值会自动转换为字符串,所以使用起来很简单。正如Rob所说,自定义“program_time”这样的键,并通过自己可能复制的map.set([1,2],'woo')来处理它;get([1,2])->未定义。有没有这样使用数组的方法?[1,2]
和[1,2]
是不同的对象。使用var-arr=[1,2]代码>map.set(arr,'woo')代码>和map.get(arr,'woo')代码>。如果无法保留对数组的引用,则必须以某种方式对其进行序列化/散列。天真地,例如,使用arr.join(',')
作为键。是的,我最终以某种奇怪的方式对它进行了哈希:)我不想使用字符串,因为它可能同时发生数百万次。太糟糕了-数组会很好。请注意,如果您使用字符串数组作为键,那么这就不太好用了。例如,vara={};变量b=[“x”、“y”、“z”];变量c=[“x,y,z”];a[b]=“呃哦”;[c]
将计算为uh-oh
。两个不同的数组b
和c
映射到同一个对象键。@感谢speedplane指出这一点。我用你的例子更新了我的答案。此外,我明确表示,我不建议您这样做。我对这个答案的流行感到惊讶。+1对于树结构,它结合了“trie”数据结构的本质,在各种算法中使用。
'a':
[value]: undefined
'b':
[value]: true
'a':
[value]: 'okay'
'b':
[value]: true