在“地图”上使用地图功能更改值

时间:2019-04-24 08:56:53

标签: javascript dictionary ecmascript-6

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

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

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

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

但是map上没有Map功能。是否有内置/优雅的方式来映射Map

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

我知道的最优雅/简洁的方法是,使用散布运算符(...)将地图转换为数组,将.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"}

答案 2 :(得分:2)

没有内置方法(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));

答案 3 :(得分:0)

您可以使用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);

答案 4 :(得分:0)

您可以这样做:

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)))