【问题标题】:Aggregate object properties in JavaScript在 JavaScript 中聚合对象属性
【发布时间】:2014-08-20 18:59:15
【问题描述】:

我想在一个对象数组中聚合属性并生成另一个具有总数的对象。

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

下面是一个对象数组,我们需要根据WeekNo范围对displayAd_impvideoAd_imptv_imp进行sum

var objArr = [{

    "Title": "July 13 - July 19 2014",
    "displayAd_imp": "15",
    "videoAd_imp": "75",
    "tv_imp": "120",
    "Date": "2014-07-17T00:00:00.000Z",
    "WeekNo": 29
}, {

    "Title": "July 20 - July 26 2014",
    "displayAd_imp": "25",
    "videoAd_imp": "65",
    "tv_imp": "130",
    "Date": "2014-07-24T00:00:00.000Z",
    "WeekNo": 30
}, {

    "Title": "July 27 - Aug 2 2014",
    "displayAd_imp": "35",
    "videoAd_imp": "55",
    "tv_imp": "140",
    "Date": "2014-07-31T00:00:00.000Z",
    "WeekNo": 31
}, {

    "Title": "Aug 3 - Aug 9 2014",
    "displayAd_imp": "55",
    "videoAd_imp": "25",
    "tv_imp": "20",
    "Date": "2014-08-07T00:00:00.000Z",
    "WeekNo": 32
}, {

    "Title": "Aug 10 - Aug 17 2014",
    "displayAd_imp": "10",
    "videoAd_imp": "70",
    "tv_imp": "120",
    "Date": "2014-08-14T00:00:00.000Z",
    "WeekNo": 33
}]

下面的函数获取范围。我们将数据、开始周和结束周作为参数传递,并按所需范围过滤数据。我有一个JSfiddle 示例来显示输出。

function CalcWeekRange(data,begin,end){
    console.log(data,begin, end);
     newArr = data.filter(function(item){
        return (item.WeekNo >= begin && item.WeekNo <= end);
    });
    console.log(newArr); 

}

在此之后,我需要将结果总结为一个看起来像这样的对象:

    {
        "displayAd_imp": "140",
        "videoAd_imp": "290",
        "tv_imp": "530",
    }

最后一部分是我卡住的地方:(

希望我把问题说清楚了,提前谢谢!

【问题讨论】:

  • 看看 reduce 函数,这个用例很棒。

标签: javascript jquery arrays object sum


【解决方案1】:

您可以将reduce 与初始累加器一起使用:

function weekRange(begin, end, data) {
  return data.filter(function(x) {
    return x.WeekNo >= begin && x.WeekNo <= end;
  }).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
  });
}

【讨论】:

  • 感谢您的快速回复!上面的 sn-p 返回 NaN -“{displayAd_imp: NaN, videoAd_imp: NaN, tv_imp: NaN}”。也许我做错了什么。我在上面的帖子中做了一个 jsfiddle,请随意使用它来进行项目。
  • 这很有趣,我明白为什么这些数字对我不起作用了。属性有不同的格式。我已更新jsfiddle.net/64gcjLku/9。 Number(x[k]) 无法读取该值,因为它包含“,”。我会试着调查一下。
  • 更新了jsfiddle.net/64gcjLku/10。它现在也应该支持上述格式。谢谢大家!!
猜你喜欢
  • 2020-11-11
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多