ES6 Map中使用Array对象作为键
P粉344355715
P粉344355715 2023-10-21 18:06:40
0
2
682

我正在尝试将我的代码更新到 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 Map 进行相同类型的字符串化 hack。

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

P粉344355715
P粉344355715

全部回复(2)
P粉529245050

您需要保存对用作键的 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);
P粉978551081

了解 ES2015 Map 键的比较(几乎)就像与 === 运算符一样。两个数组实例,即使它们包含相同的值,也不会以 === 的方式相互比较。

试试这个:

var a = new Map(), key = ['x', 'y'];
a.set(key, 1);
console.log(a.get(key));

由于 Map 类旨在用作基类,因此您也许可以使用重写的 .get() 函数来实现子类。

(第一句中的“几乎”是反映Map键相等性比较是通过Object.is()完成的,这在日常编码中很少出现。本质上是 JavaScript 中相等测试的第三种变体。)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板