在JavaScript对象属性的百分比计算变化(Calculating change in perc

2019-10-30 11:43发布

我想计算的数据范围的百分比变化通过它的前范围。

这里是我工作的一个例子:

下面是我需要计算变化百分比对象的数组displayAd_impvideoAd_imptv_impbased基于选择的属性WeekNo范围。

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将是:

当前周(32,33):1400 + 1500 = 2900(我们有这部分在sumArr

前周(30,31):1600 + 1500 = 3100

%变化:(2900 / 3100-1)* 100 = -6.45(注:负是允许的)

以上会发生的性质其余为好。

希望这些问题的例子是清楚的,感谢您的时间!

Answer 1:

你的意思是这样的,除了你的上述对象数组和代码?

var jCurrent = CalcWeekRange(objArr,32,33);
var jPrevious = CalcWeekRange(objArr,30,31);
var jCurrentDisplay = jCurrent[0].displayAd_imp;
var jPreviousDisplay = jPrevious[0].displayAd_imp;
var result = (jCurrentDisplay/jPreviousDisplay-1)*100;
console.log("result ", result);

调整你的jsfiddle此处的jsfiddle

更新:如果您想根据实际本周得到的结果,这可以通过以下调整到上面的代码来完成:

Date.prototype.getWeek = function() {
 var firstday = new Date(this.getFullYear(),0,1);
 var today = new Date(this.getFullYear(),this.getMonth(),this.getDate());
 var dayOfYear = ((today - firstday + 86400000)/86400000);
 return Math.ceil(dayOfYear/7)
};

var today = new Date();
var currentWeekNumber = today.getWeek();

var jCurrentDynamic = CalcWeekRange(objArr,currentWeekNumber-1,currentWeekNumber);
var jPreviousDynamic = CalcWeekRange(objArr,currentWeekNumber -3,currentWeekNumber -2);

var jCurrentDisplayDynamic = jCurrentDynamic[0].displayAd_imp;
var jPreviousDisplayDynamic = jPreviousDynamic[0].displayAd_imp;
var resultDynamic = (jCurrentDisplayDynamic/jPreviousDisplayDynamic-1)*100;
console.log("resultDynamic ", resultDynamic);

我已经更新了小提琴,并增加了对象的实际电流周数34(仅用于测试33周复印件),所以小提琴将停止下周工作:)

更新演示



文章来源: Calculating change in percent of the properties in JavaScript objects