簡體   English   中英

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

[英]Array.map 1 element to multiple element

我有[3, 16, 120] 當我做[3, 16, 120].map(mapper) ,我想實現,例如[4,5, 17,18, 121,122]即每個元素映射到 n+1 和 n+2。 這當然是一個例子 - 我想要的是簡單地從映射器函數中推送多個值

我是否必須使用 Array.each 並推送到一個數組,或者是否可以使用 Array.map (或其他內置 api)

您可以使用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)

這是帶有箭頭功能的 ES6 版本

 var ar = [3, 16, 120]; var result = ar.reduce((r, e) => r.push(e+1, e+2) && r, []); console.log(result)

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

因此,與公認的解決方案相比,.push 更可取。

我自己想出了一個,使用擴展運算符。

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

2019年更新

使用 ES10 中引入的Array.prototype.flatMap()

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]

不是特別好,但這是一個可能的解決方案:

 var arr = [3, 16, 120]; console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));

您可以為每個項目生成一個數組,然后連接所有這些數組:

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

您可以將Array#reduceArray#concat結合使用。

 console.log([3, 16, 120].reduce(function (r, a) { return r.concat(a + 1, a + 2); }, []));

ES6

 console.log([3, 16, 120].reduce((r, a) => r.concat(a + 1, a + 2), []));

不可變解決方案,使用擴展運算符:

[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])

使用Array#concatArray#map

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

只是為了好玩,一個帶有生成器的 ES6 解決方案:

 var arr = [3, 16, 120]; var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})(); console.log(result);

使用 Array.prototype.flat():

 const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat(); console.log(doubled)

公平警告 – 到目前為止還不是標准方法(發布於 12/2018)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM