【问题标题】:Array as a javascript map's key?数组作为 javascript 地图的键?
【发布时间】:2017-12-02 19:12:05
【问题描述】:

Map 是 ECMA6 中的一个新对象,如果为同一个键分配多个值,它将覆盖所有以前的值。例如,

'use strict';

var m = new Map();

m.set(['aaron', 100]);
m.set(['aaron', 100], 1);
m.set(['aaron', 100], 10);
m.set(['aaron', 100], 100);
m.set(['aaron', 100], 1000);
m.set(['aaron', 100], 10000);

console.log(m.get(['aaron', 100]));

它会显示一个奇怪的输出(未定义),为什么?非常感谢。

【问题讨论】:

    标签: javascript arrays dictionary


    【解决方案1】:

    Map 使用对数组的引用作为键,而不是数组的内容。

    这个简单的比较表明,内容相同的数组,不是同一个数组(引用不同):

    const a = ['aaron', 100];
    const b = ['aaron', 100];
    
    console.log(a === b);

    如果您设置并获得相同的参考,它会起作用:

    const arr = ['aaron', 100];
    const m = new Map();
    m.set(arr);
    m.set(arr, 1);
    m.set(['aaron', 100], 10);
    m.set(['aaron', 100], 100);
    m.set(['aaron', 100], 1000);
    m.set(['aaron', 100], 10000);
    
    console.log(m.get(arr));

    【讨论】:

    • @mplungjan - 如果要查看地图,可以查看浏览器的控制台。
    • 查看浏览器的控制台,或使用 m.entries() 查看 [key, value] 对
    【解决方案2】:

    在 JavaScript 中,数组、对象或函数是引用类型,当您比较它们时,您实际上所做的是将引用与它们在内存中的位置进行比较,而不是它们的值。由于它们都分配到不同的位置,结果将返回“false”。

    您应该做的是将它们转换为原始类型。 JSON字符串例如:

    let a = {1: 'foo'},
        b = {1: 'foo'};
        
    console.log(a === b);
    console.log(JSON.stringify(a) == JSON.stringify(b));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多