2017-09-13 10 views
-4

このコードをforループの代わりにreduceを使用するように変換したいと思います。我々は減らす使用して、同じアウトプットを取得できますかforループの代わりにreduceを使用する

var a = [1, 2, 30, 4, 5, 6]; 
 
var add = 0; 
 
var r = []; 
 

 
for (var i = 0; i < a.length; i++) { 
 
\t add = 0; 
 
\t for (var j = 0; j < i; j++) { 
 
    \t add += a[j]; 
 
    } 
 
    if (a[i] > add) { 
 
    \t r.push(a[i]); 
 
    } 
 
} 
 
console.log(r); // => [ 1, 2, 30 ]

+2

を縮小するために、関連する何かをしようとしたのですか? – ochi

+0

出力[1,2,30]のロジックは何ですか – Ved

+0

'a.splice(0、a.length/2)' – baao

答えて

1

var array = [1, 2, 30, 4, 5, 6], 
 
    result = []; 
 

 
array.reduce((r, a) => (a > r && result.push(a), r + a), 0); 
 

 
console.log(result); // [1, 2, 30]

2

あなたは.filter()を使用します。これは、より小さいサブセットのセットに減らすことに特有の縮小を実行します。フィルタコールバック内で.reduce()を使用して、そのポイントまでの数値を合計します。

var a = [1, 2, 30, 4, 5, 6]; 
 
var r = a.filter((n, i, arr) => 
 
    n > arr.slice(0, i).reduce((s, nn) => s + nn, 0) 
 
) 
 
console.log(r); // => [ 1, 2, 30 ]


内側.reduce()それだけで余分な値を毎回加算なので、実際にやや冗長です。これを避けるには、外部変数を参照して外部変数を引き続き追加することができます。あなたが前の項目の合計を収集しArray#reduceを使用すると、値が結果セットにプッシュしているかどうかを確認するためにそれを取ることができ

var a = [1, 2, 30, 4, 5, 6]; 
 
var s = 0; 
 
var r = a.filter((n, i, arr) => { 
 
    s = i && (s + arr[i-1]); 
 
    return n > s 
 
}) 
 
console.log(r); // => [ 1, 2, 30 ]

関連する問題