2015-02-05 78 views
0

我試圖根據季度系統計算總和。 [10,20,30,40,50,60,70,80,90] - 初始陣列根據季度計算總和

我正在尋找的結果是 [60, 150, 70, 80, 90]Q1 = 10+20+30 = 60 Q2 = 40+50+60 = 150 Q3將完成只有通過在十月價值。

我感到困惑與邏輯我有

var adata = [10,20,30,40,50,60,70,80,90]; 
 
process(adata, "Sept 2014"); 
 

 
function process(adata, date){ 
 
    var today = new Date(date) || new Date(); 
 
    var aQuarter = []; 
 
\t var tempQuarter = []; 
 
    var aSum = []; 
 
    //var quarter = Math.floor((today.getMonth() + 3)/3); 
 
    for(var i = 0; i<= today.getMonth(); i++) { 
 
     aQuarter.push(adata[i]); 
 
    } 
 
    tempQuarter = adata.slice(); 
 
    if(tempQuarter.length > 3) { 
 
\t \t var i = 0; 
 
     var sum = []; 
 
\t \t while(i <= 2) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
     console.log(sum); 
 
\t \t aQuarter.unshift(sum); 
 
\t } 
 
    if(tempQuarter.length > 6){ 
 
\t \t var i = 0; 
 
     var sum = []; 
 
\t \t while(i+1 <= 3) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
\t \t aQuarter.unshift(sum); 
 
\t } 
 
    console.log(aQuarter); 
 
    if(tempQuarter.length > 9){ 
 
\t \t var i = 0; 
 
\t \t while(i+2 <= 4) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
\t } 
 
}

jsfiddle

+0

你說結果應該是...... [60,150,80,80,90]'。你不是指[60,150,70,80,90]嗎? – Bijan 2015-02-05 20:40:21

+0

對不起,我的壞。我的意思是'[60,150,70,80,90]'。更新 ! – user525146 2015-02-05 20:45:36

回答

1

對不起與搗鼓了一下週圍的發揮,得到了這個,讓您的結果,它會爲工作您?

var adata = [10,20,30,40,50,60,70,80,90]; 
console.log("Sept 2014"); 
process(adata, "Sept 2014"); 

console.log("April 2014"); 
process(adata, "April 2014"); 

console.log("March 2014"); 
process(adata, "March 2014"); 

console.log("December 2014"); 
process(adata, "December 2014"); 

function process(adata, date){ 
    var today = new Date(date) || new Date(); 

    // reults array init 
    var tempArray = []; 
    var eachQuarterAmount = 3; 
    // Limit the values to January to today as defined by the date param 
    var aDataUpToPoint = adata.slice(0,today.getMonth() + 1); 
    console.log(aDataUpToPoint); 

    for (var i = 0; i < aDataUpToPoint.length; i+=eachQuarterAmount) { 
    // increment every 3 values 

     if (typeof aDataUpToPoint[i+eachQuarterAmount] != 'undefined') { 
      // If there's anything after (ie if there's Oct) then total previous values up using reduce 
      tempArray.push(aDataUpToPoint.slice(i,i+eachQuarterAmount).reduce(function(total, num){ return total + num },0)); 
     } else { 
      // If the hunt for red October failed just tack on whatever remains 
      for (; i < aDataUpToPoint.length; i++) { 
       // uses the same loop contol variable as the parent to complete the search in both cases, picks up where it left off 
       tempArray.push(aDataUpToPoint[i]); 
      } 
     } 
    } 
    console.log(tempArray); 
} 

編輯:減少一些幻數... sorta。

注:剛剛意識到你正在做一個Date參數的東西...所以真的是我adata.length可能應該有today.getMonth()

編輯2代替:切片ADATA降到日期範圍內的工作,增加了+1到數據集並從前瞻中刪除+1。

+0

謝謝,這就是我正在尋找的東西,就像一個魅力 – user525146 2015-02-05 21:08:55

+0

@ user525146對不起,我弄錯了隧道,並忘記了腳本的第一部分關於日期參數...我認爲你可以很容易地解決這個問題,我做了一個筆記關於它,但雅,不知道我是否完全理解你的意圖 – 2015-02-05 21:10:46

+0

我更新了代碼爲'today.getMonth()',它給了我不同的結果在不同的情況下,'http:// jsfiddle.net/8f2k679x /' – user525146 2015-02-05 21:52:33

1

我有一個較短的版本與循環總和季度價值只。未使用的元素在最後連接在一起。

var adata = [10,20,30,40,50,60,70,80,90]; 
process(adata, "Sept 2014"); 

function process(adata, date) { 
    var today = new Date(date) || new Date(); 
    var QUOTER = 3; 
    var month = today.getMonth(); 
    var limit = (month > adata.length) ? adata.length : month; 
    var aQuarter = []; // quater sum array 
    var sum = 0;  // gather sum for each quarter 
    for (var i=0; i < limit; i++) { 
    sum += parseInt(adata[i]); 
    if ((i+1) % QUOTER == 0) { 
     aQuarter.push(sum); 
     sum = 0; 
    } 
    } 
    var usedElements = aQuarter.length * QUOTER; 
    if (adata.length > usedElements) 
    aQuarter = aQuarter.concat(adata.slice(usedElements)); 

    console.log("On " + today + " the sums are " + aQuarter); 
} 

這是DEMO,你可以玩日期設置。

+0

它的數據按預期工作,感謝您的簡化版本 – user525146 2015-02-10 16:54:04

+0

我試圖創建一個與上面類似的邏輯列名稱的表。我有這個代碼,'http:// jsfiddle.net/q8ftcj57 /'。這可以進一步簡化嗎? – user525146 2015-02-10 16:55:05

+1

你需要這樣的東西:http://jsfiddle.net/7uxx802o/6/ – MaxZoom 2015-02-10 20:25:27