Array.map 1个元素到多个元素

Boy*_*ang 31 javascript map-function

我有[3, 16, 120].当我这样做时[3, 16, 120].map(mapper),我想实现,例如[4,5, 17,18, 121,122]每个元素映射到n + 1和n + 2.这当然是一个例子 - 我想要的是简单地从mapper函数中推送多个值

我是否必须使用Array.each并推送到数组,或者是否可以使用Array.map(或其他内置的api)来实现

Nen*_*car 34

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

这是带箭头功能的ES6版本

var ar = [3, 16, 120];

var result = ar.reduce((r, e) => r.push(e+1, e+2) && r, []);
console.log(result)
Run Code Online (Sandbox Code Playgroud)

PS:Array.push似乎更快,没有Maximum call stack..错误,见下文:

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
Run Code Online (Sandbox Code Playgroud)

所以.push比公认的解决方案更可取.

  • 您正在回调中修改`r`,这意味着这只是不必要的`for`循环。 (2认同)

Boy*_*ang 19

我自己想出一个,使用传播操作符.

[].concat(...[3, 16, 120].map(x => [x+1, x+2]))


jab*_*tta 16

2019年更新

使用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]
Run Code Online (Sandbox Code Playgroud)


mel*_*ene 11

不是特别好,但它是一个可能的解决方案:

var arr = [3, 16, 120];

console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
Run Code Online (Sandbox Code Playgroud)

  • @eltonkamami 无论如何我已经分配了 n+3 个数组。n+4 不会让事情变得更糟。 (2认同)