根据季度计算总和

时间:2015-02-05 20:34:15

标签: javascript

我试图根据季度系统得到总数的总和。 [10,20,30,40,50,60,70,80,90] - 初始数组

我正在寻找的结果是 [60, 150, 70, 80, 90] Q1 = 10+20+30 = 60的位置 Q2 = 40+50+60 = 150 只有在10月份通过价值时,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 = [];
	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) {
		var i = 0;
        var sum = [];
		while(i <= 2) {
			sum[i] = aQuarter.shift();
			i++;
		}
        console.log(sum);
		aQuarter.unshift(sum);
	}
    if(tempQuarter.length > 6){
		var i = 0;
        var sum = [];
		while(i+1 <= 3) {
			sum[i] = aQuarter.shift();
			i++;
		}
		aQuarter.unshift(sum);
	}
    console.log(aQuarter);
    if(tempQuarter.length > 9){
		var i = 0;
		while(i+2 <= 4) {
			sum[i] = aQuarter.shift();
			i++;
		}
	}
}
&#13;
&#13;
&#13;

jsfiddle

2 个答案:

答案 0 :(得分: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。

注意:刚刚意识到你正在使用日期参数执行某些操作...所以我的adata.length实际应该替换为today.getMonth()

编辑2:将aData切片以在日期范围内工作,向数据集添加+1并从前瞻中移除+1。

答案 1 :(得分: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进行日期设置。