Javascript 使用数组对象作为ES6映射的键
我正在尝试将我的代码更新到ES6,因为我使用的是Node4.0,到目前为止我非常喜欢它的特性。但是,我对新的ES6Javascript 使用数组对象作为ES6映射的键,javascript,arrays,dictionary,ecmascript-6,es6-map,Javascript,Arrays,Dictionary,Ecmascript 6,Es6 Map,我正在尝试将我的代码更新到ES6,因为我使用的是Node4.0,到目前为止我非常喜欢它的特性。但是,我对新的ES6Map数据结构有问题,因为当使用Array作为键时,它的行为与{}不同。我用它作为一个计数器地图 我运行这段代码,我想知道如何使用数组作为映射的键 "use strict"; var a = new Map(); a.set(['x','y'], 1); console.log(a.get(['x','y'])); var b = {}; b[['x','y']] = 1; c
Map
数据结构有问题,因为当使用Array
作为键时,它的行为与{}
不同。我用它作为一个计数器地图
我运行这段代码,我想知道如何使用数组作为映射的键
"use strict";
var a = new Map();
a.set(['x','y'], 1);
console.log(a.get(['x','y']));
var b = {};
b[['x','y']] = 1;
console.log(b[['x','y']]);
它打印出以下内容,第一行应该是1
,而不是未定义的:
undefined
1
原始的JS映射将密钥字符串化,我不想对新的ES6map
进行同样类型的字符串化攻击
如何可靠地使用数组作为ES6Map
的键?了解ES2015 Map键的比较(几乎)就像与=
操作符进行比较一样。两个数组实例,即使它们包含相同的值,也不会作为==
相互比较
试试这个:
var a = new Map(), key = ['x', 'y'];
a.set(key, 1);
console.log(a.get(key));
由于Map类旨在用作基类,因此可以使用重写的.get()
函数实现子类
(第一句中的“几乎”是为了反映这样一个事实,即映射键相等性比较是通过Object.is()
完成的,这在日常编码中并不多见。它本质上是JavaScript中相等性测试的第三种变体。)您需要保存对用作键的数组的非基本实例的引用。请注意以下两个示例中的差异:
“严格使用”;
var a=新映射();
a、 集合(['x','y'],1);
log(a.get(['x','y']);
log(['x','y']==['x','y']);
var b=新映射();
变量数组=['x','y'];
b、 集合(数组,1);
log(b.get(array));
console.log(array==array)代码>我也有这个需要,所以我编写了一个ISC许可库:。你可以。我认为这是很清楚的,但对后代来说,它是如何运作的:
维护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)
为什么是一棵树?因为当多个数组具有相同的前缀时,它非常有效,这在现实世界中非常典型,用于处理例如文件路径。感谢详细的回答,但覆盖。get()
不是我想要实现的TL的可能重复;DR:JavaScript中的集合都将数组键转换为字符串。。。因此,您只有两种可能:A.使用字符串(考虑到JS集合无论如何都会这样做,如果您使用元组,这可能不是一种很糟糕的方法,即key.split(“,”[0]key.split(“,”[1]
),或B.将数组拆分,并将其元素映射和子映射到彼此中,就像安科的答案+阵列键控地图一样。。。