【问题标题】:Calculating change in percent of the properties in JavaScript objects计算 JavaScript 对象中属性百分比的变化
【发布时间】:2014-08-21 23:08:10
【问题描述】:

我想通过它的先前范围来计算一系列数据的百分比变化。

这是我正在做的一个例子:

下面是一组对象,我需要根据WeekNo 范围的选择来计算displayAd_impvideoAd_imptv_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


    【解决方案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 周的副本用于测试),所以小提琴将在下周停止工作:)

    Updated Demo

    【讨论】:

    • 感谢调整jsfiddle,有没有办法动态计算?我喜欢你这样做的方式,但开始和结束参数将来自下拉字段,所以在使用新参数再次调用函数之前,我们需要检查周范围,然后在前几周再次调用函数。
    • @user3061445 很高兴听到它朝着正确的方向发展。当然可以动态地拥有它,只需要一些进一步的输入 - 本周总是下拉/数组中的最后一个条目?在不知道数组中对象的数量的情况下,我不得不猜测一下。或者是否有必要获取当前周,例如使用日期函数,知道选择哪个对象来获取当前范围?
    • 我认为我们不需要在 SO 上发布整个数据对象。
    • @TomášZato 是的,抱歉,您是对的,感谢您的建议。只是相应地编辑了答案。
    • jsfiddle.net/k97LLwju/3 - 这就是我的目标,这不是最漂亮的方式,但可以完成工作。感谢您的想法!
    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2019-01-26
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多