Использование функции карты на «карте» для изменения значений - PullRequest
11 голосов
/ 24 апреля 2019

Я могу использовать 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 ]

12 голосов
/ 24 апреля 2019

Вы можете использовать Array.from для получения записей и отображения новых значений и принять этот результат для нового Map.

const b = new Map(Array.from(
    a, 
    ([k, v]) => [k, doSomethingWith(v)]
));
4 голосов
/ 24 апреля 2019

Самый элегантный / лаконичный способ, который мне известен, - это преобразовать карту в массив с помощью оператора распространения (...), применить .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 голосов
/ 24 апреля 2019

Для этого нет встроенных методов ( пока !).В настоящее время наиболее элегантным способом является использование генераторов:

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

Однако я рекомендую написать вспомогательные функции для этого, которые работают с произвольными итерациями:

function* mapValue(iterable, callback) {
    for (const [k, v] of a)
        yield [k, callback(v)];
}
const b = new Map(mapValue(a, doSomethingWith));
0 голосов
/ 24 апреля 2019

Вы можете сделать это так:

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)))
0 голосов
/ 24 апреля 2019

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...