Javascript ES6映射:转换值

Javascript ES6映射:转换值,javascript,typescript,es6-map,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); }

我正在从事一个项目,经常需要转换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);
}
const positiveMap=新映射(
[
[hello',1],
[《世界》,2]
]
);
const negativeMap=新映射();
for(positiveMap.keys()的常量键){
负映射集(键,正映射获取(键)*-1);
}
只是想知道是否有更好的方法?理想情况下是一个类似于
Array.map()
的单行程序


如果以typescript编译,则会获得额外的积分(不是真的)

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

const positiveMap=newmap([['hello',1],'world',2]]);
const negativeMap=newmap([…positiveMap].Map([k,v])=>[k,v*-1]))

console.log([…negativeMap])
您可以使用
数组。从
第2个参数,映射样式回调:

const positiveMap=newmap([['hello',1],'world',2]]),
negativeMap=新映射(Array.from(positiveMap,([k,v])=>[k,-v]));

log([…negativeMap])
如果需要,可以使用自己的类扩展
映射
,并包括像数组一样对其进行一般性迭代的功能:

类数组映射扩展映射{
地图(fn,thisArg){
const{constructor:Map}=this;
常量映射=新映射();
for(此.entries()的常量[key,value]){
set(key,fn.call(thisArg,value,key,this));
}
返回图;
}
forEach(fn,thisArg){
for(此.entries()的常量[key,value]){
调用(thisArg,value,key,this);
}
}
减压阀(fn,蓄能器){
常量迭代器=this.entries();
if(arguments.length<2){
如果(this.size==0)抛出新的TypeError('Reduce of empty map with no initial value');
累加器=迭代器.next().value[1];
}
for(迭代器的常量[键,值]){
累加器=fn(累加器、值、键、本);
}
回流蓄能器;
}
每(fn,thisArg){
for(此.entries()的常量[key,value]){
如果(!fn.call(thisArg,value,key,this))返回false;
}
返回true;
}
一些(fn,thisArg){
for(此.entries()的常量[key,value]){
if(fn.call(thisArg,value,key,this))返回true;
}
返回false;
}
// ...
}
常量正映射=新数组映射(
[
[hello',1],
[《世界》,2]
]
);
常量negativeMap=positiveMap.map(值=>-value);

negativeMap.forEach((值,键)=>console.log(键,值))根据trincot的答案,您可以拥有一个通用的typescript函数

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])]));
}

@AluanHaddad
.entries()
返回迭代器,而不是键/值对数组。那不行。@PatrickRoberts你说得对。(用手敲击头部)对于任何关心(微基准点)的人来说,使用
手动复制。在V8上,forEach
的速度要快一个数量级。就地突变速度快了一个数量级。并不是说它真的会很好!正是我想要的。过去我遇到过一些问题,
ts jest
没有在地图上正确传输扩展操作符。。。但这与当时的问题并不相关hand@NSjonas您可以使用
Array.from
而不是
[…]
有关如何使其在TS中编译的任何想法?*%20-1%5D))%0D%0a唯一的.log(%5B…negativeMap%5D)nvm,只需使用'as[string,number]`强制从返回数组即可。在启动映射之前创建中间数组可以节省时间。知道这会引发类型错误(在typescript中)的原因吗?看起来我可以在
数组的末尾使用
作为[string,number]
强制类型。从
开始,您对仅仅通过原型扩展(使用全局
types.d.ts
)有何想法?坏主意?我对TypeScript几乎没有经验,但我的一般建议是,如果要引入新功能,请将其放入新类中,这样就不会使本机类与现有类型定义不兼容。
transformMap(positiveMap, (key, value) => -value)