【发布时间】:2014-08-21 23:08:10
【问题描述】:
我想通过它的先前范围来计算一系列数据的百分比变化。
这是我正在做的一个例子:
下面是一组对象,我需要根据WeekNo 范围的选择来计算displayAd_imp、videoAd_imp 和tv_impbased 属性的百分比变化。
var objArr = [{
"Title": "July 13 - July 19 2014",
"displayAd_imp": "3,500",
"videoAd_imp": "1.5",
"tv_imp": "0.52",
"Date": "2014-07-17T00:00:00.000Z",
"WeekNo": 29
}, {
"Title": "July 20 - July 26 2014",
"displayAd_imp": "1,600",
"videoAd_imp": "2.55",
"tv_imp": "0.052",
"Date": "2014-07-24T00:00:00.000Z",
"WeekNo": 30
}, {
"Title": "July 27 - Aug 2 2014",
"displayAd_imp": "1,500",
"videoAd_imp": "2.1",
"tv_imp": "0.122",
"Date": "2014-07-31T00:00:00.000Z",
"WeekNo": 31
}, {
"Title": "Aug 3 - Aug 9 2014",
"displayAd_imp": "1,500",
"videoAd_imp": "1.99",
"tv_imp": "0.254",
"Date": "2014-08-07T00:00:00.000Z",
"WeekNo": 32
}, {
"Title": "Aug 10 - Aug 17 2014",
"displayAd_imp": "1,400",
"videoAd_imp": "2.0",
"tv_imp": ".235",
"Date": "2014-08-14T00:00:00.000Z",
"WeekNo": 33
}];
在下面的方法中,我试图通过首先过滤具有开始和结束WeekNo 的数据,然后计算该数据的总和来完成此任务。这是一个jsfiddle 工作示例。
function CalcWeekRange(data,begin,end){
//console.log(data,begin, end);
var newArr = data.filter(function(item){
return (item.WeekNo >= begin && item.WeekNo <= end);
});
var sumArr = [newArr.reduce(function (acc, x) {
Object.keys(acc).forEach(function (k) {
acc[k] += Number(x[k]);
});
return acc;
}, {
displayAd_imp: 0,
videoAd_imp: 0,
tv_imp: 0,
})];
console.log(sumArr);
}
我遇到困难的部分是通过获取先前范围的总和然后当前/先前 - 1 来计算该期间的百分比变化。例如,在上面的 jsfiddle 中,我们称为 CalcWeekRange(objArr,32,33);。
displayAd_imp 的百分比变化逻辑是:
Current Weeks(32,33): 1400+1500 = 2900(我们在sumArr有这部分)
前几周(30,31):1600+1500 = 3100
%Change: (2900/3100-1)*100 = -6.45 (注:允许负数)
其余属性也会发生上述情况。
希望问题和示例清楚,感谢您的宝贵时间!
【问题讨论】:
标签: javascript jquery arrays object