Элемент Array.map 1 для нескольких элементов

У меня есть [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]