2012-08-09 64 views

回答

7

你可以做一個_.reduce()得到這個:

_.reduce([1, 2, 3, 4, 5], function (acc, n) { acc.push((acc.length > 0 ? acc[acc.length-1] : 0) + n); return acc }, []) 

更可讀的版本放在這裏:

var prefixSum = function (arr) { 
    var builder = function (acc, n) { 
     var lastNum = acc.length > 0 ? acc[acc.length-1] : 0; 
     acc.push(lastNum + n); 
     return acc; 
    }; 
    return _.reduce(arr, builder, []); 
} 
+0

你測試過了嗎?對我而言,它返回[1,2,3,4,5],與我嘗試的嘗試類似。 – user664023 2012-08-09 20:00:46

+0

@ user664023:是的,輕微的錯字。雖然現在修復了。 – 2012-08-09 20:01:05

+0

明白了 - 謝謝。 – user664023 2012-08-09 20:06:21

3

_.map()也是一種選擇:

_.map(array,function(num,i){ if(i > 0) array[i] += array[i-1]; }); 

jsFiddle DEMO

注意,這個編輯原始數組,而不是技術上有什麼_.map是應該做

如果你想創建一個新的數組非破壞性版本:

var array = [1,2,3,4,5]; 
var cumulative = 0; 
var sums = _.map(array,function(num){ 
    cumulative += num; 
    return cumulative; 
}); 

jsFiddle DEMO

+5

好的解決方案,但出於好奇,這不會違反函數式編程的思想,因爲累積是函數的副作用嗎? – bob 2013-08-21 01:38:47