_[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の方が望ましいです。
スプレッド演算子を使用して、自分で1つを思い付きます。
[].concat(...[3, 16, 120].map(x => [x+1, x+2]))
特にいいわけではありませんが、考えられる解決策です。
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#reduce
_ を _Array#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), []));
楽しみのために、ジェネレーターを備えたES6ソリューション:
var arr = [3, 16, 120];
var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})();
console.log(result);
スプレッド演算子を使用した不変のソリューション:
[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])
Array#concat
およびArray#map
を使用
Array.prototype.concat.apply([], [3, 16, 120].map(x => [x+1, x+2] ));
Array.prototype.flat()の使用:
const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();
console.log(doubled)
公正な警告–現在までの標準的な方法ではありません(2018年12月投稿)。