【问题标题】:How to implement map in Javascript where value is an array of strings similarly as we have in Java?如何在 Javascript 中实现 map,其中 value 是一个字符串数组,就像我们在 Java 中一样?
【发布时间】:2019-12-31 22:11:57
【问题描述】:

我正在寻找一种在 javascript 中实现 HashMap 功能的方法。我发现 map() 作为 es6 中引入的全局对象,我们可以使用它来做同样的事情。但是将 aa 值作为数组似乎不起作用。任何人都可以帮助我。
@987654321 @

下面是示例代码的sn-p。

    var map1 = new Map(); 
    var names=['abc','bcd','abc'];
    for(var i=0;i<name.length;i++){
        if(map1.has(name[i]))
            map1.set(name[i],map1.get(name[i]).push('B'));//if key is already there append B
        else
            map1.set(name[i],['A']);//if key is not present append A
    }

    console.log(map1);

我期望密钥 abc 的值为['A','B']

实际结果: Map { 'abc' =&gt; 2, 'bcd' =&gt; [ 'A' ] }

预期结果: Map { 'abc' =&gt; ['A','B'],'bcd' =&gt; ['A']}

【问题讨论】:

  • 还要注意.push()返回数组的新长度,而不是数组本身。
  • 这是因为您正在分配 map1.get(name[i]).push('B')result 并且该结果是数组的新长度。你不需要分配任何东西——JS中的数组实际上就像Java中的ArrayLists,可以正常增长。此外,由于您要存储数组 reference,因此对数组的任何修改都将与它所在的地图“共享”。因为您只修改同一个对象。只做map1.get(name[i]).push('B')) 而不要同时做map.set

标签: javascript node.js dictionary ecmascript-6


【解决方案1】:

Array.prototype.push 在插入新元素后返回新数组的大小而不是数组本身。

只需执行Map.get(key) 即可获取前一个数组reference 并按下插入的键,您无需再次执行Map.set(key)

var map1 = new Map(); 
const names = ['abc','bcd','abc'];

for(let i=0; i<names.length; i++){
   if(map1.has(names[i])){
      map1.get(names[i]).push('B');
   }
   else{
      map1.set(names[i], ['A'] );
   }
}

console.log(...map1.entries());

另外name 指的是全局变量window.name 所以不要使用它作为变量名:

console.log(Object.is(name, window.name));

【讨论】:

    【解决方案2】:

    如果你使用var,不要使用name作为变量名,它会与window.name冲突,或者只使用let name,或者使用任何其他变量名,

    同样push返回数组的长度,所以当你做map1.set(key, x.push('B'))它会将长度设置为那个键的值而不是数组,所以使用concat或者你可以使用...扩展语法

    let map1 = new Map();
    let name = ['abc', 'bcd', 'abc'];
    for (let i = 0; i < name.length; i++) {
      if(map1.has(name[i])){
        map1.set(name[i], map1.get(name[i]).concat('B'))
      }else{
        map1.set(name[i], ['A'])
      }
    }
    
    console.log([...map1]);

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 2023-03-14
      • 2016-03-12
      相关资源
      最近更新 更多