Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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 - Fatal编程技术网

如何在Javascript中使用数组作为键?

如何在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键是字符串 您需要一个或一个自定义方法来将数组映射到其他对象。这对您有用吗 变

我有一个关于python的简单示例:

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