首页  >  问答  >  正文

ES6 Map中使用Array对象作为键

我正在尝试将我的代码更新到 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粉344355715P粉344355715364 天前644

全部回复(2)我来回复

  • P粉529245050

    P粉5292450502023-10-22 13:33:57

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

    回复
    0
  • P粉978551081

    P粉9785510812023-10-22 11:23:32

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

    试试这个:

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

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

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

    回复
    0
  • 取消回复