使用Array对象作为ES6 Map的键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Array对象作为ES6 Map的键相关的知识,希望对你有一定的参考价值。

我正在尝试将我的代码更新为ES6,因为我使用的是Node 4.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 qazxsw poi进行相同类型的stringify破解。

对于ES6 Map,我能做些什么才能可靠地使用数组作为键?

答案

了解ES2015 Map键与Map运算符进行比较。两个数组实例,即使它们包含相同的值,也不会将===相互比较。

试试这个:

===

由于Map类可用作基类,因此可以实现具有重写var a = new Map(), key = ['x', 'y']; a.set(key, 1); console.log(a.get(key)); 函数的子类。

另一答案

您需要保存对用作键的.get()的非原始实例的引用。请注意以下两个示例中的区别:

Array
另一答案

我也有这个需求,所以我写了一个ISC许可的库:"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);。你可以array-keyed-map。我认为find it on npm非常清楚,但无论如何,对于后人来说,这是它的工作原理:


保持一棵the source物体。每棵树都存储:

  • 在内部声明的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]-symbol-key下的任何值,并在递归步骤后删除任何子树,如果它们的[value]为0。


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

以上是关于使用Array对象作为ES6 Map的键的主要内容,如果未能解决你的问题,请参考以下文章

ES6,Array.from的用法

ES6 - Map

在 es6 Map 上调用 `Array.prototype.some()` 的更好方法

js es6 map 与 原生对象区别

了解ES6的Map数据结构

ES6 Set 和 Map