我正在开展一个项目,我经常需要转换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()
一样的衬里。
奖励积分(不是真的),如果它在打字稿中编译!
答案 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)