我试图根据季度系统得到总数的总和。
[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;
答案 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进行日期设置。