Javascript 使用数组对象作为ES6映射的键

Javascript 使用数组对象作为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

我正在尝试将我的代码更新到ES6,因为我使用的是Node4.0,到目前为止我非常喜欢它的特性。但是,我对新的ES6
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映射将密钥字符串化,我不想对新的ES6
map
进行同样类型的字符串化攻击


如何可靠地使用数组作为ES6
Map
的键?

了解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.将数组拆分,并将其元素映射和子映射到彼此中,就像安科的答案+阵列键控地图一样。。。