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

How to use array as key in Javascript?

本文关键字:数组 Javascript      更新时间:2023-09-26

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

programs = {}
if not programs.has_key(( program, time )):
     programs[( program, time )] = 0
programs[( program, time )] = programs[( program, time )] + 1

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

这将"工作"。(但我不推荐)

var a = {};
var b = [1,2,3];    
a[b] = 'hello';
// a[b] evaluates to 'hello'
// a[[1,2,3]] evaluates to 'hello'
// a['1,2,3'] evaluates to 'hello'

它之所以有效,是因为当您将数组 [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 键是字符串。

您需要一个WeakMap或自定义方法来将数组映射到其他对象。

我写了一个名为array-keyed-map的库,用于在现代JavaScript中健壮地做到这一点。 与到目前为止发布的其他答案不同,它不依赖于将值序列化为字符串,而是使用 ES2015 Map对象,可以接受任意值作为键。

我将引用我对另一个问题的回答作为实现概述,因此该方法会保留下来,以防库因某种原因消失,或者您想自己实现它:

维护Map对象的树。 每棵树存储:

  • 在内部声明的 Symbol 键下:树中该点的值(如果有)。 Symbol保证了唯一性,所以没有 用户提供的值可以覆盖此键。

  • 在它的所有其他键上:到目前为止,所有其他设置的树都来自这棵树。

例如,在akmap.set(['a', 'b'], true) 上,内部树 结构会像——

'a':
  [value]: undefined
  'b':
    [value]: true

在那之后做akmap.set(['a'], 'okay')只会改变 'a' 处路径的值:

'a':
  [value]: 'okay'
  'b':
    [value]: true

要获取数组的值,请在读取时循环访问数组 树上的相应键。 如果树返回undefined 在任何时候都不存在。 最后,阅读内部声明 [value]你去过的树上的符号。

要删除数组的值,请执行相同的操作,但删除所有值 在 [value] 符号键下,并删除 递归步骤,如果它们最终以 0 size结束。


为什么是一棵树? 因为当多个阵列具有 相同的前缀,这在实际使用中非常典型,用于工作 例如文件路径。

这会为你解决问题吗?

斯菲德尔

<script>
var ary = {person1:'valerie', person2:'alex'};
for (key in ary) {
    document.write(key, '<br>')
}
document.write(ary['person2'], '<br>')
</script>