У меня есть [3, 16, 120]
. когда я делаю [3, 16, 120].map(mapper)
, я хочу достичь, например, [4,5, 17,18, 121,122]
т.е. каждый элемент отображает n + 1 и n + 2. Это, конечно, пример - я хочу просто нажать несколько значений из функции mapper
Должен ли я использовать Array.each и нажимать на массив, или это можно сделать с помощью Array.map(или другого встроенного api)
Ответ 1
Вы можете использовать reduce()
и добавить в массив e+1, e+2
каждого элемента.
var ar = [3, 16, 120];
var result = ar.reduce(function(r, e) {
r.push(e+1, e+2);
return r;
}, []);
console.log(result)
Ответ 2
Я сам придумал, используя оператор распространения.
[].concat(...[3, 16, 120].map(x => [x+1, x+2]))
Ответ 3
Не особенно приятно, но это возможное решение:
var arr = [3, 16, 120];
console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
Ответ 4
вы можете создать массив для каждого элемента, а затем объединить все эти массивы:
[3, 16, 120].map(x => [x+1, x+2] ).reduce( (acc,val) => acc.concat(val), []);
Ответ 5
Вы можете использовать Array#reduce
в сочетании с Array#concat
.
console.log([3, 16, 120].reduce(function (r, a) {
return r.concat(a + 1, a + 2);
}, []));
Ответ 6
используя Array#concat
и Array#map
Array.prototype.concat.apply([], [3, 16, 120].map(x => [x+1, x+2] ));
Ответ 7
Просто для удовольствия, решение ES6 с генератором:
var arr = [3, 16, 120];
var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})();
console.log(result);
Ответ 8
Неизменное решение с оператором распространения:
[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])
Ответ 9
Используя Array.prototype.flat():
const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();
console.log(doubled)
Ответ 10
Используйте Array.prototype.flatMap()
, представленный в ES10.
const oddNumbers = [1, 3, 5, 7, 9];
const allNumbers = oddNumbers.flatMap((number) => [number, number + 1]);
console.log(allNumbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]