【问题标题】:Using a map function on a 'Map' to change values在“地图”上使用地图功能来更改值
【发布时间】:2019-09-13 12:28:01
【问题描述】:

我可以使用Map 然后设置值:

const a = new Map([["a", "b"], ["c", "d"]])

现在,如果我想以函数的方式将函数应用于所有值(没有 for ... of.forEach),我想我可以这样做:

const b = a.map(([k, v]) => [k, doSomethingWith(v)]);

但是Map 上没有map 函数。是否有一种内置/优雅的方式来映射Map

【问题讨论】:

  • 对它们使用Map#entries 然后.map a.entries().map(...)
  • @ponury-kostek 它不起作用,因为Map.entries() 返回一个迭代器(不是数组);而迭代器还没有.map 方法...
  • 不幸的是,没有优雅的方式。您必须处理条目,然后从结果中生成一个新的地图。

标签: javascript dictionary ecmascript-6


【解决方案1】:

您可以使用Array.from 获取条目和映射新值,并将此结果作为新的Map

const b = new Map(Array.from(
    a, 
    ([k, v]) => [k, doSomethingWith(v)]
));

【讨论】:

    【解决方案2】:

    我知道的最优雅/简洁的方法是使用扩展运算符 (...) 将地图转换为数组,将.map 应用于该数组,然后再次从中创建地图:

    const a = new Map([["a", "b"], ["c", "d"]])
    const b = new Map([...a].map(([k,v])=>[k, v.toUpperCase()]))
    // b: Map(2) {"a" => "B", "c" => "D"}
    

    【讨论】:

      【解决方案3】:

      没有用于此的内置方法 (yet!)。目前最优雅的方式是使用生成器:

      const b = new Map((function*() {
          for (const [k, v] of a)
              yield [k, doSomethingWith(v)];
      })());
      

      但是,我建议为此编写 helper functions 以使用任意可迭代对象:

      function* mapValue(iterable, callback) {
          for (const [k, v] of a)
              yield [k, callback(v)];
      }
      const b = new Map(mapValue(a, doSomethingWith));
      

      【讨论】:

        【解决方案4】:

        您可以使用 Symbol.iterator 来更改或创建新地图。

        function f (iterator) {
          for (let item of iterator1) {
            item[0] = 1;
            item[1] = 'hello world';
            console.log(item);
          }
        }
        
        var map1 = new Map();
        map1.set('0', 'foo');
        map1.set(1, 'bar');
        var iterator1 = map1[Symbol.iterator]();
        
        f(iterator1);

        【讨论】:

        • for (let item of iterator1) 应该是iterator,不是吗?
        • 问题是:'以功能方式(没有 for ... of 或 .forEach)'。这个例子使用for...of
        【解决方案5】:

        你可以这样做:

        let b = new Map(a)
        b.forEach((value,key,myMap) => myMap.set(key, dosomething(value)))
        

        或:

        let b
        (b = new Map(a)).forEach((value,key,myMap) => myMap.set(key, dosomething(value)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          相关资源
          最近更新 更多