javascript - 扫描嵌套对象的数组以查找匹配项

标签 javascript arrays javascript-objects

我有一个看起来像这样的对象 -

{
"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”)中的“缺失”报告,并推送所有属性(展示次数、点击次数、成本)均为零的新报告,因此,campaign1 除了 1 月和 4 月的报告外,还将有 2 月和 3 月的报告,只是用零而不是真实数据。 Campaign2 将有另外三个报告(一月、二月和四月),也用零代替真实数据。

到目前为止我尝试过的(没有取得多大成功)-

reports_array.forEach(function(arr_report) {
    for(let campaign in campaigns) {
        if(campaigns[campaign].hasOwnPropert('reports')) {
            campaigns[campaign].reports.forEach(function(report) {
                if(report.month !== arr_report) {
                    console.log('campaign '+campaign+' is missing '+arr_report);
                    campaigns[campaign].reports.push({
                       month: arr_report,
                       impressions: 0,
                       clicks: 0,
                       cost: 0
                    });
                }
            });
        }
    }
});

最佳答案

这是一种方法:

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
      }
    ]
  }
}

JSFiddle 演示:https://jsfiddle.net/wfya0ycs/3/

关于javascript - 扫描嵌套对象的数组以查找匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43219468/

相关文章:

java - 如何在java中将2个键盘输入放入二维数组?

javascript - 使用循环将数组值分配给元素

javascript - 如何对JSON对象进行计数并在计数的基础上取相同的输出

javascript - 在 Angular JS 中动态应用 CSS 样式属性

javascript - 计算动态html表格的总计和小计

javascript - 使用 flutter/dart/javascript 在网络上打印 PDF

javascript - 如果未定义键,则将变量名作为 javascript 对象中的键

自定义 URL 的 Javascript 正则表达式?

php - 在数组中显示 csv 文件

javascript - 对象嵌套属性访问