Javascript 扫描嵌套对象';匹配数组

Javascript 扫描嵌套对象';匹配数组,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个像这样的物体- { "Campaigns": { "Campaign1": { "reports": [ { "month": "Google - January - Monthly Report.csv", "impressions": 53, "clicks": 31, "cost": 18

我有一个像这样的物体-

{
"Campaigns":
{
"Campaign1":
{
    "reports":
        [
            {
                "month": "Google - January - Monthly Report.csv",
                "impressions": 53,
                "clicks": 31,
                "cost": 18
            },
            {
                "month": "Google - April - Monthly Report.csv",
                "impressions": 13,
                "clicks": 11,
                "cost": 8
            }
        ]
    },
"Campaign2":
{
    "reports":
        [
            {
                "month": "Google - March - Monthly Report.csv",
                "impressions": 13,
                "clicks": 11,
                "cost": 8
            }
        ]
}
}
}

我还有一个附加的数组和文件名。。让我们以这个数组为例-

reports_array = [
                 'Google - January - Monthly Report.csv',
                 'Google - February - Monthly Report.csv',
                 'Google - March - Monthly Report.csv',
                 'Google - April - Monthly Report.csv'
                 ]
我希望完成的是扫描每个活动中的“缺失”报告(在本例中为“活动1”和“活动2”),并在所有属性(印象、点击、成本)中推送一个包含零的新报告,因此,除了“一月和四月报告”,活动1将包含二月和三月报告,只有零而不是真实数据。此外,campaign2还将发布另外三份报告(1月、2月和4月),报告中的数据也将为零,而不是真实数据

到目前为止我所做的尝试(不太成功)-

这里有一种方法:

var campaigns = campaigns_object.Campaigns;

Object.keys(campaigns)
  .forEach(function(campaign) {
    reports_array.forEach(function(report, index) {
      var has_report = campaigns[campaign].reports.some(function(campaign_report) {
        return (campaign_report.month === report);
      });

      if (!has_report) {
        campaigns[campaign].reports.splice(index, 0, {
            month: report,
          impressions: 0,
          clicks: 0,
          cost: 0
        });
      }
    });
  });

console.log(campaigns);
这会给你这个结果:

{
  "Campaign1": {
    "reports": [
      {
        "month": "Google - January - Monthly Report.csv",
        "impressions": 53,
        "clicks": 31,
        "cost": 18
      },
      {
        "month": "Google - February - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - March - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - April - Monthly Report.csv",
        "impressions": 13,
        "clicks": 11,
        "cost": 8
      }
    ]
  },
  "Campaign2": {
    "reports": [
      {
        "month": "Google - January - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - February - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - March - Monthly Report.csv",
        "impressions": 13,
        "clicks": 11,
        "cost": 8
      },
      {
        "month": "Google - April - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      }
    ]
  }
}
jsiddle演示:

这里有一种方法:

var campaigns = campaigns_object.Campaigns;

Object.keys(campaigns)
  .forEach(function(campaign) {
    reports_array.forEach(function(report, index) {
      var has_report = campaigns[campaign].reports.some(function(campaign_report) {
        return (campaign_report.month === report);
      });

      if (!has_report) {
        campaigns[campaign].reports.splice(index, 0, {
            month: report,
          impressions: 0,
          clicks: 0,
          cost: 0
        });
      }
    });
  });

console.log(campaigns);
这会给你这个结果:

{
  "Campaign1": {
    "reports": [
      {
        "month": "Google - January - Monthly Report.csv",
        "impressions": 53,
        "clicks": 31,
        "cost": 18
      },
      {
        "month": "Google - February - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - March - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - April - Monthly Report.csv",
        "impressions": 13,
        "clicks": 11,
        "cost": 8
      }
    ]
  },
  "Campaign2": {
    "reports": [
      {
        "month": "Google - January - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - February - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      },
      {
        "month": "Google - March - Monthly Report.csv",
        "impressions": 13,
        "clicks": 11,
        "cost": 8
      },
      {
        "month": "Google - April - Monthly Report.csv",
        "impressions": 0,
        "clicks": 0,
        "cost": 0
      }
    ]
  }
}
jsiddle演示:

功能填充(活动、报告){
对于(活动中的var键){//对于活动对象中的每个活动
reports.filter(函数(report){//过滤掉缺少的报告
返回活动[key].reports.every(函数(creport){//如果此活动的报告数组中的每个报告都不等于此报告,则认为缺少此报告
返回creport.month!==报告;
});
}).forEach(函数(报表){//然后针对缺少的报表数组中的每个报表
活动[key].reports.push({//push一个新的空白报告
“月”:报告,
“印象”:0,
“点击”:0,
“成本”:0
});
});
}
}
var campaigns_object={“campaigns”:{“Campaign1”:{“reports”:[{“month”:“Google-January-Monthly Report.csv”,“impressions”:53,“clicks”:31,“cost”:18},{“month”:“Google-April-Monthly Report.csv”,“impressions”:13,“clicks”:11,“cost”:8}},{“reports”:{“reports”:[{“month”:“month”:“Google-March-Monthly Report.csv”,“impressions”:13,“clicks”:11,“cost”:8}}}}}},
报告数组=[“谷歌-一月-月报.csv”、“谷歌-二月-月报.csv”、“谷歌-三月-月报.csv”、“谷歌-四月-月报.csv”];
填充(活动\对象.活动,报告\数组);
console.log(活动\u对象)
功能填充(活动、报告){
对于(活动中的var键){//对于活动对象中的每个活动
reports.filter(函数(report){//过滤掉缺少的报告
返回活动[key].reports.every(函数(creport){//如果此活动的报告数组中的每个报告都不等于此报告,则认为缺少此报告
返回creport.month!==报告;
});
}).forEach(函数(报表){//然后针对缺少的报表数组中的每个报表
活动[key].reports.push({//push一个新的空白报告
“月”:报告,
“印象”:0,
“点击”:0,
“成本”:0
});
});
}
}
var campaigns_object={“campaigns”:{“Campaign1”:{“reports”:[{“month”:“Google-January-Monthly Report.csv”,“impressions”:53,“clicks”:31,“cost”:18},{“month”:“Google-April-Monthly Report.csv”,“impressions”:13,“clicks”:11,“cost”:8}},{“reports”:{“reports”:[{“month”:“month”:“Google-March-Monthly Report.csv”,“impressions”:13,“clicks”:11,“cost”:8}}}}}},
报告数组=[“谷歌-一月-月报.csv”、“谷歌-二月-月报.csv”、“谷歌-三月-月报.csv”、“谷歌-四月-月报.csv”];
填充(活动\对象.活动,报告\数组);

console.log(活动\u对象)插入顺序重要吗???插入顺序重要吗???