如何在 Javascript 中使用数组作为键
How to use array as key in Javascript?
我有一个简单的关于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]
符号键下,并删除 递归步骤,如果它们最终以 0size
结束。为什么是一棵树? 因为当多个阵列具有 相同的前缀,这在实际使用中非常典型,用于工作 例如文件路径。
这会为你解决问题吗?
斯菲德尔
<script>
var ary = {person1:'valerie', person2:'alex'};
for (key in ary) {
document.write(key, '<br>')
}
document.write(ary['person2'], '<br>')
</script>
- 如何遍历包含对象的数组-javascript
- 保存数组javascript
- 查找数组javascript中包含的元素类型
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 从多维数组javascript中提取特定值
- 如何在数组javascript中选择伪随机值
- 拆分字符串数组(JavaScript)后未定义
- 从数组JavaScript中删除并返回最后n个项的最快方法
- 使用条件for循环更新数组-Javascript
- 从数组javascript创建新对象
- 用数组(javascript)中的值替换regex捕获
- 从数组[Javascript]的总长度中减去一个干净的数字
- 将一个字符串数组解析为一个新的数组javascript
- 如何将对象转换为对象数组javascript
- 赢得't循环数组javascript
- 从不同的数组 JavaScript 中获取值
- 多维数组 JAVASCRIPT 出了点问题
- 可以't分配给一个对象数组javascript
- 比较数组JavaScript中的对象
- 如何完成缺少(连续)元素的数组|Javascript