ES6 Map:转换值

时间:2018-02-01 20:13:44

标签: javascript typescript es6-map

我正在开展一个项目,我经常需要转换ES6地图中的每个值:

const positiveMap = new Map(
  [
    ['hello', 1],
    ['world', 2]
  ]
);

const negativeMap = new Map<string, number>();
for (const key of positiveMap.keys()) {
  negativeMap.set(key, positiveMap.get(key) * -1);
}

只是想知道是否有更好的方法可以做到这一点?理想情况下是一个像Array.map()一样的衬里。

奖励积分(不是真的),如果它在打字稿中编译!

4 个答案:

答案 0 :(得分:4)

您可以使用 c0 | c1 | _______________ 1 | 2 | 3 | 4 | 5 | 6 | 28 | 3 | 2 nd 参数,这是一种地图式回调:

Array.from

答案 1 :(得分:3)

您可以使用展开式语法...将其转换为数组,应用map()方法,然后再将其转换为Map

const positiveMap = new Map([['hello', 1],['world', 2]]);

const negativeMap = new Map([...positiveMap].map(([k, v]) => [k, v * -1]))
console.log([...negativeMap])

答案 2 :(得分:1)

如果您愿意,可以使用自己的类扩展Map,并包含像数组一样迭代它的功能:

class ArrayMap extends Map {
  map (fn, thisArg) {
    const { constructor: Map } = this;
    const map = new Map();
    
    for (const [key, value] of this.entries()) {
      map.set(key, fn.call(thisArg, value, key, this));
    }
    
    return map;
  }
  
  forEach (fn, thisArg) {
    for (const [key, value] of this.entries()) {
      fn.call(thisArg, value, key, this);
    }
  }
  
  reduce (fn, accumulator) {
    const iterator = this.entries();
    
    if (arguments.length < 2) {
      if (this.size === 0) throw new TypeError('Reduce of empty map with no initial value');
      accumulator = iterator.next().value[1];
    }
    
    for (const [key, value] of iterator) {
      accumulator = fn(accumulator, value, key, this);
    }
    
    return accumulator;
  }
  
  every (fn, thisArg) {
    for (const [key, value] of this.entries()) {
      if (!fn.call(thisArg, value, key, this)) return false;
    }
    
    return true;
  }
  
  some (fn, thisArg) {
    for (const [key, value] of this.entries()) {
      if (fn.call(thisArg, value, key, this)) return true;
    }
    
    return false;
  }
  
  // ...
}

const positiveMap = new ArrayMap(
  [
    ['hello', 1],
    ['world', 2]
  ]
);
const negativeMap = positiveMap.map(value => -value);

negativeMap.forEach((value, key) => console.log(key, value));

我免费投放reduce()every()some()。实施您喜欢或需要的方法中的任意一种或多种。

答案 3 :(得分:0)

您可以基于Trincot的答案获得通用的打字稿功能

function transformMap<K, V, U>(source: Map<K, V>, func: (key: K, value: V) => U): Map<K, U> {
  return new Map(Array.from(source, (v) => [v[0], func(v[0], v[1])]));
}

并像这样使用它

transformMap(positiveMap, (key, value) => -value)