首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数组对象作为ES6映射的键

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

Stack Overflow用户
提问于 2015-09-18 20:05:30
回答 4查看 22K关注 0票数 39

我正在尝试将我的代码更新为ES6,因为我使用的是Node4.0,并且非常喜欢它的特性。但是,我对新的ES6 Map数据结构有问题,因为当使用Array作为键时,它的行为与{}不同。我正在用它作为反地图。

我运行这段代码,我想知道如何使用数组作为Map的键。

代码语言:javascript
复制
"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

代码语言:javascript
复制
undefined
1

最初的JS映射将键串成串,我不想使用新的ES6 Map进行相同类型的字符串攻击。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-18 20:07:26

理解ES2015映射键被比较(几乎),就像与===操作符一样。两个数组实例,即使它们包含相同的值,也不要将它们作为===进行比较。

试试这个:

代码语言:javascript
复制
var a = new Map(), key = ['x', 'y'];
a.set(key, 1);
console.log(a.get(key));

因为Map类的目的是作为一个基类使用,所以您可以使用重写的.get()函数实现一个子类。

(第一句中的“几乎”是要反映这样一个事实,即Map键相等比较是通过Object.is()完成的,而这在日常编码中并不多见。它本质上是JavaScript中等式测试的第三个变种。)

票数 18
EN

Stack Overflow用户

发布于 2019-04-08 07:34:49

我也有这样的需求,所以我写了一个ISC许可的库:数组键-映射。你可以在国家预防机制上找到它。我认为来源是非常清楚的,但无论如何,对于后代来说,它是如何工作的:

维护Map对象树。每棵树都有:

  • 在内部声明的Symbol键下:树中那个点的值(如果有的话)。Symbol保证唯一性,因此用户提供的值不能覆盖此键。
  • 在它所有的其他键上:从这棵树到现在为止的所有其他树。

例如,在akmap.set(['a', 'b'], true)上,内部树结构类似于-

代码语言:javascript
复制
'a':
  [value]: undefined
  'b':
    [value]: true

在此之后执行akmap.set(['a'], 'okay')只会更改'a'路径的值

代码语言:javascript
复制
'a':
  [value]: 'okay'
  'b':
    [value]: true

若要获取数组的值,请迭代数组,同时从树中读取相应的键。如果树在任何一点上不存在,则返回undefined。最后,从树中读取内部声明的[value]符号。

若要删除数组的值,请执行相同的操作,但删除[value]-符号-键下的任何值,并在递归步骤后删除任何子树(如果它们的size为0 )。

为什么是树?因为当多个数组具有相同的前缀时(这在实际使用中是非常典型的),用于处理例如文件路径是非常有效的。

票数 10
EN

Stack Overflow用户

发布于 2017-07-11 18:12:43

您需要保存对作为键使用的Array的非原始实例的引用。注意以下两个示例中的不同之处:

代码语言:javascript
复制
"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);

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32660188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档