web-dev-qa-db-ja.com

Array.map 1要素から複数の要素

_[3, 16, 120]_があります。 [3, 16, 120].map(mapper)を実行すると、たとえば_[4,5, 17,18, 121,122]_を達成したい、つまり各要素がn + 1とn + 2にマップされます。これはもちろん一例です-マッパー関数から複数の値をプッシュするだけです

Array.eachを使用して配列にプッシュする必要がありますか、それともArray.map(または他の組み込みAPI)を使用して実行できますか

31
Boyang

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の方が望ましいです。

33
Nenad Vracar

スプレッド演算子を使用して、自分で1つを思い付きます。

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

19
Boyang

特にいいわけではありませんが、考えられる解決策です。

var arr = [3, 16, 120];

console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
11
melpomene

各アイテムの配列を作成し、これらの配列をすべて連結できます。

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

_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), []));
4
Nina Scholz

楽しみのために、ジェネレーターを備えたES6ソリューション:

var arr = [3, 16, 120];

var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})();

console.log(result);
2
Me.Name

スプレッド演算子を使用した不変のソリューション:

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

Array#concatおよびArray#mapを使用

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

Array.prototype.flat()の使用:

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

console.log(doubled)

公正な警告–現在までの標準的な方法ではありません(2018年12月投稿)。

1
HynekS