2014-10-31 141 views
1

我需要執行一個數組的累加和。在某些情況下,我需要它是直線前進,並發現該片段到偉大的工作:數組的累積和,在另一個數組中的條件

cumul = sum.reduce(function (a, n) { 
         a.push((a.length > 0 ? a[a.length-1] : 0) + n); 
         return a; 
        }, [initial]); 
cumul.shift(); 
Logger.log(cumul); 

當我登錄「cumul」我得到的結果,我需要。但是,在其他IF()條件下,我需要執行累計總和,以在包含日期的另一個數組中提供某個條件 - 如果日期爲< = X,則不要在此迭代中添加累計總和累計值)。

任何想法如何實現?似乎使用這個累積和的版本是行不通的,但我不確定會有什麼其他方法可以解決這個問題。

在此先感謝! G

+0

我的第一個建議是,你凝結兩個數據結構合而爲一。 'var arr = [{val:7,date:'2014-10-31'},{val:3,date:'2014-11-01'}]'然後遍歷一個數據結構。由於'javascript'數組並不是真正的數組,因此這樣做不會有性能損失。 – 2014-10-31 10:49:42

+0

對於非條件累積和,請參閱http://stackoverflow.com/questions/20477177/creating-an-array-of-cumulative-sum-in-javascript - 可能重用某些循環結構和輔助函數。 – Paul 2014-10-31 11:05:15

回答

1

在推動和減少和轉移的過程中,你對自己的生活過於苛刻。

function running_total(array, init) { 
 
    return array 
 
     .map(function(v, i) { return v ===3 ? 0 : v; }) // filter out 3's 
 
     .map(function(v) { return init += v; }) 
 
    ; 
 
} 
 

 
document.writeln(running_total([1,2,3,4,5], 0));

爲了使過濾器屬於另一個日期的平行排列,改變第一地圖功能的東西,如

function(v, i) { return dates[i] < cutoff ? 0 : v; } 
+0

這將返回[1,3,3,7,12]。有沒有一種方法讓函數跳過給定迭代中的值,但如果它符合標準則在下一個計算它呢?例如,在這個例子中,我想這是結果:[1,3,3,10,15]。謝謝! – GimelG 2014-10-31 14:51:05

+0

當然有一種方法,它是一臺電腦,所以你只要編程就可以做任何你想做的事情。您需要另一個變量來跟蹤未添加的值,以便稍後將其添加回來。 – 2014-10-31 16:40:04

+0

對,我的意思是如果有一種方法使用這種方法來實現這一點:)希望有進一步的指導,相當新的JavaScript。再次感謝。 – GimelG 2014-10-31 16:58:35

1

For循環在Javascript中速度非常快,並且可以創建條件和的各種各樣的 。

下面的函數ccSum()需要2個參數,一個數據數組和一個條件數組。 如果條件爲真,則數據相加。

function ccSum(data, condition){ 
    var r = []; 
    r[0] = (condition[0])? data[0]: 0; 
    for(i=1,l=data.length; i<l; ++i) r[i] = r[i-1] + ((condition[i])? data[i]: 0); 
    return r 
} 

這將是容易改寫這其中的條件是一個函數被調用,通過改變方括號condition[i]一個condition(i)一個回合。或者,我們可以檢查typeof(condition)==='function'並分支這兩種情況。