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对象)代码>插入顺序重要吗???插入顺序重要吗???