2016-07-22 11 views
12

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

Array.eachを使用して配列にプッシュするか、Array.map

+0

はおそらく、' Array.reduce'を使用することができます。 – jcaron

答えて

8

特に素晴らしくはないが、それは可能な解決策である:

var arr = [3, 16, 120]; 
 

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

+0

'Array.prototype.concat' '[] .concat'の代わりに。その短いが、これは毎回新しい配列を割り当てています – eltonkamami

+1

@eltonkamamiすでにn + 3配列を割り当てています。 n + 4は物事をさらに悪化させません。 – melpomene

13

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が好ましい。

+0

コールバックで 'r'を修正しています。これは、これは不必要に複雑な' for'ループであることを意味しています。 – melpomene

+0

私は答えのためのパフォーマンステストを追加しました。この場合、 '.concat'と比較して' .push'が望ましいと思われます。また、concatは大きな配列の '最大呼び出しスタック'例外をスローします – Kostanos

4

あなたは、すべてのこれらの配列CONCAT、各項目のための配列を作り出すことができる:

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

ニースしかし、配列の2回のパスを行い、配列を倍増 – Boyang

+0

はい私は@Nenad Vracarソリューションが私よりも良いと思います –

1

Array#concatArray#map

ちょうど楽しみのため
Array.prototype.concat.apply([], [3, 16, 120].map(x => [x+1, x+2])); 
2

、発電機とES6ソリューション:

var arr = [3, 16, 120]; 
 

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

 
console.log(result);

+0

これはうまくいかないことは分かっています... 1.ジェネレータはスプレッド演算子で拡張できます(うまくiterableです)。2.スプレッド演算子は代入よりも遅いです。 – Boyang

4

あなたがArray#concatとの組み合わせでArray#reduceを使用することができます。

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), []));

+0

これは私のシナリオで完璧に機能しました。ありがとう –

14

Iは、拡散演算子を使用して、1と自分自身を思い付きます。私はそれが `Array.forEach`を使用するよりも良くなるだろうか分からないけれども

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

関連する問題