【问题标题】:JavaScript map object not saving object keys?JavaScript映射对象不保存对象键?
【发布时间】:2020-02-17 14:46:47
【问题描述】:

所以我正在尝试向地图对象添加一个条目,其中键是一个对象,但它似乎不起作用。

let myMap = new Map();
myMap.set({type : 'sum', val : 10},1);
console.log(myMap.get({type:'sum',val:10})); <---- this returns undefined

为什么返回 undefined 而不是 1?

【问题讨论】:

    标签: javascript hashmap undefined


    【解决方案1】:

    原因是对象是对 JavaScript 中值的引用。因此,即使具有相同值的两个对象也被评估为不同,因为它存储为两个不同的值。如果你使用相同的,你会得到你期望的结果:

    let myMap = new Map();
    const key = {type : 'sum', val : 10}
    myMap.set(key, 1);
    console.log(myMap.get(key)); // 1
    

    【讨论】:

      【解决方案2】:

      javascriot 在您设置和获取此结构时使用 SameValueZero 算法来存储键。 SameValueZero 类似于严格相等 (===)。因为在 get 方法中,您正在创建新对象并将其作为键传递给此方法,所以此键不严格等于您设置时使用的对象,因此您得到 null。

      【讨论】:

        【解决方案3】:

        即使用作键的两个对象看起来相等(因为它们具有相同的属性),但它们并不相等(根据 === 这或多或少是使用的操作 - see here for more details)。

        如果您执行以下操作,它将起作用:

        let myMap = new Map();
        var obj = {type : 'sum', val : 10};
        myMap.set(obj,1);
        console.log(myMap.get(obj));
        

        【讨论】:

          【解决方案4】:

          Map 是一个键值对,您可以在其中存储一个带有它的键的值。 喜欢:

          let map = new Map();
                   // key     // value
          map.set('myKey','just a text');
          

          然后要访问该值,您需要在这种情况下为“myKey”的键

          map.get('myKey'); // will return just a text
          

          如果您希望将对象转换为地图,请关注article

          let obj = {
            name: "John",
            age: 30
          };
          
          let map = new Map(Object.entries(obj));
          
          alert( map.get('name') ); // John
          

          【讨论】:

            【解决方案5】:

            您使用了 2 个恰好具有相同属性的不同对象。但是,它们并不相等。要使其工作,您必须使用完全相同的对象,如下所示:

            let myMap = new Map();
            var obj = {type : 'sum', val : 10};
            myMap.set(obj,1);
            console.log(myMap.get(obj));
            

            【讨论】:

              【解决方案6】:

              它应该只接受键值对,所以你提供对象代替键。

               myMap.set({type : 'sum', val : 10},1);
               myMap.set( {key:1, val: {type : 'sum', val : 10}} );
              

              尝试使用一个键并将对象 { type:'',val:''} 添加到它作为它的值。尝试将“1”包装到对象本身

              因为您需要一个密钥才能访问它。

              参考:[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map][1]

              它将返回myMap.size

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-23
                • 2013-08-01
                • 1970-01-01
                • 2013-10-12
                相关资源
                最近更新 更多