Ответ 1
Вы можете использовать Array.from
для получения записей и отображения новых значений и использовать этот результат для новой Map
.
const b = new Map(Array.from(
a,
([k, v]) => [k, doSomethingWith(v)]
));
Я могу использовать Map
а затем установить значения:
const a = new Map([["a", "b"], ["c", "d"]])
Теперь, если я хочу применить функцию ко всем значениям функциональным способом (без for... of
или .forEach
), я подумал, что мог бы сделать что-то вроде этого:
const b = a.map(([k, v]) => [k, doSomethingWith(v)]);
Но на map
нет функции Map
. Есть ли встроенный/элегантный способ нанести на карту Map
?
Вы можете использовать Array.from
для получения записей и отображения новых значений и использовать этот результат для новой Map
.
const b = new Map(Array.from(
a,
([k, v]) => [k, doSomethingWith(v)]
));
Самый элегантный/лаконичный способ, который мне известен, - это преобразовать карту в массив с помощью оператора распространения (...
), применить .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"}
Для этого нет встроенных методов (пока !). Самый элегантный способ в настоящее время - использовать генераторы:
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));
Вы можете использовать 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);
Вы можете сделать это так:
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)))