Array.map 1 element to multiple element
You can use reduce()
and add to array e+1, e+2
of each element.
var ar = [3, 16, 120];
var result = ar.reduce(function(r, e) {
r.push(e+1, e+2);
return r;
}, []);
console.log(result)
This is ES6 version with arrow function
var ar = [3, 16, 120];
var result = ar.reduce((r, e) => r.push(e+1, e+2) && r, []);
console.log(result)
PS: Array.push seems to be faster and has no Maximum call stack..
error, see below:
a = Array(1000000).fill(1); st = Date.now(); Array.prototype.concat.apply([], a.map(function (n) { return [n+1, n+2]; })); console.log(`${Date.now() - st}ms `);
> RangeError: Maximum call stack size exceeded
a = Array(1000000).fill(1); st = Date.now(); a.reduce((r, e) => r.push(e+1, e+2) && r, []); console.log(`${Date.now() - st}ms `);
> 180ms
So .push is preferable comparing to accepted solution.
I come up with one myself, using spread operator.
[].concat(...[3, 16, 120].map(x => [x+1, x+2]))
2019 Update
Use Array.prototype.flatMap()
, introduced in 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]