2017-09-13 165 views
-4

我想將此代碼轉換爲使用reduce而不是for循環。使用reduce而不是for循環

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

你可以使用一個Array#reduce它收集先前項目的總和,並把它做了檢查,如果值已推到結果集。

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()實際上是有點多餘的,因爲它只是總結每一次額外的價值。爲了避免這種情況,你可以引用一個外部變量並繼續添加它。

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 ]

相關問題