我正在尝试将我的代码更新为ES6,因为我使用的是Node4.0,并且非常喜欢它的特性。但是,我对新的ES6 Map数据结构有问题,因为当使用Array作为键时,它的行为与{}不同。我正在用它作为反地图。
我运行这段代码,我想知道如何使用数组作为Map的键。
"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
undefined
1最初的JS映射将键串成串,我不想使用新的ES6 Map进行相同类型的字符串攻击。
如何才能可靠地使用数组作为ES6 Map的键?
发布于 2015-09-18 20:07:26
理解ES2015映射键被比较(几乎),就像与===操作符一样。两个数组实例,即使它们包含相同的值,也不要将它们作为===进行比较。
试试这个:
var a = new Map(), key = ['x', 'y'];
a.set(key, 1);
console.log(a.get(key));因为Map类的目的是作为一个基类使用,所以您可以使用重写的.get()函数实现一个子类。
(第一句中的“几乎”是要反映这样一个事实,即Map键相等比较是通过Object.is()完成的,而这在日常编码中并不多见。它本质上是JavaScript中等式测试的第三个变种。)
发布于 2019-04-08 07:34:49
我也有这样的需求,所以我写了一个ISC许可的库:数组键-映射。你可以在国家预防机制上找到它。我认为来源是非常清楚的,但无论如何,对于后代来说,它是如何工作的:
维护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]-符号-键下的任何值,并在递归步骤后删除任何子树(如果它们的size为0 )。
为什么是树?因为当多个数组具有相同的前缀时(这在实际使用中是非常典型的),用于处理例如文件路径是非常有效的。
发布于 2017-07-11 18:12:43
您需要保存对作为键使用的Array的非原始实例的引用。注意以下两个示例中的不同之处:
"use strict";
var a = new Map();
a.set(['x','y'], 1);
console.log(a.get(['x','y']));
console.log(['x','y'] === ['x','y']);
var b = new Map();
var array = ['x','y'];
b.set(array, 1);
console.log(b.get(array));
console.log(array === array);
https://stackoverflow.com/questions/32660188
复制相似问题