将不存在的项目推送到数组

Pushing non existent items to array

本文关键字:数组 项目 不存在      更新时间:2023-09-26

所以我有这个数组:

var period = [{"total":852, "date":"2016-03"}, {"total":963, "date":"2016-03"},{"total":789,"date":"2016-02"},{"total":456,"date":"2016-04"},{"total":123,"date":"2016-01"},{"total":723,"date":"2016-01"}];

我需要显示按月份分组的"总"数据。这意味着我必须对数组中重复的月份的"总"金额求和(2016-03、2016-01)。为了找到解决方案,我需要了解为什么这个

for ( var i = 0; i < period.length; i++ ){
 if (periodB.indexOf(period[i].date) == -1){
     periodB.push(period[i].date);  
 }

返回此:

  ["2016-03", "2016-02", "2016-04", "2016-01"]

而这个:

for ( var i = 0; i < period.length; i++ ){
  if (periodB.indexOf(period[i].date) == -1){
  periodB.push({"date": period[i].date, "total": period[i].total});
  }
}

正在返回此:

  [{date: "2016-03",total: 1704}, {date: "2016-03", total: 1926}, {date:"2016-02", total: 1578},{date: "2016-04",total: 912}, {date: "2016-01",total: 246}, {date: "2016-01", total: 1446 }]

在第一种情况下,重复的"日期"不会被推送到periodB数组,但在第二种情况下会被推送到。

您可以使用临时对象和一个forEach循环来解决您的任务

var obj = {};
period.forEach(e => {
    var month = e.date.split('-')[1]
    obj[month] = obj[month] + e.total || e.total
});

结果将是一个以月份为关键字、以总和为值的对象

{
    '03': 1815, 
    '02': 789,
    '04': 456,
    '01': 846
}

工作示例:

var period = [{ "total": 852, "date": "2016-03" }, { "total": 963, "date": "2016-03" }, { "total": 789, "date": "2016-02" }, { "total": 456, "date": "2016-04" }, { "total": 123, "date": "2016-01" }, { "total": 723, "date": "2016-01" }];
var obj = {};
period.forEach(e => {
    var month = e.date.split('-')[1]
    obj[month] = obj[month] + e.total || e.total
});
document.write(JSON.stringify(obj, 0, 2));