我正在编写一个从广告平台获取一些数据的应用程序。我的数据结构如下所示:
{
campaign_id: 123,
campaign_name: SomeName,
subcampaigns: [
{country: Australia, impressions: 12000, cost: 12},
{country: Australia, impressions: 14000, cost: 17},
{country: Singapore, impressions: 10000, cost: 7},
{country: Singapore, impressions: 7000, cost: 6}
]
}
我需要把它变成这样:
[{
campaign_name: SomeName,
country: Australia,
impressions: 36000
cost: 29
},
{
campaign_name: SomeName,
country: Singapore
impressions: 17000
cost: 13
}]
在 NodeJS 中执行此类 Map-Reduce 操作的最佳方法是什么?
谢谢。
最佳答案
一种可能的方法:
var groupedSubcampaigns = _.groupBy(data.subcampaigns, 'country');
var summator = function(memo, el) {
return memo + el;
};
var result = _.map(groupedSubcampaigns, function(group, country) {
return {
campaign_name: data.campaign_name,
country: country,
impressions: _.reduce(_.pluck(group, 'impressions'), summator, 0),
cost: _.reduce(_.pluck(group, 'cost'), summator, 0)
}
});
console.log(result);
Demo (不知何故,很难找到一个包含外部库选项的 Node.js 在线键盘,但我想 jsfiddle 在这种情况下可以正常工作)。
解释...好吧,我实际上相信这里的代码是不言自明的。 ) 首先,我们创建按国家/地区分组的子营销事件的哈希值,然后使用 _.map
遍历该哈希值的每个项目,减少其展示次数
和成本
具有“求和器”功能的属性。
不过,仍有改进的空间:您可以放弃 pluck
方法并使用单个reduce 来遍历集合,如下所示:
var summator = function(memo, el) {
memo.impressions += el.impressions;
memo.cost += el.cost;
return memo;
};
var result = _.map(groupedSubcampaigns, function(group, country) {
var aggregateObj = _.reduce(group, summator, {impressions:0, cost:0});
return _.extend(aggregateObj, {
campaign_name: data.campaign_name,
country: country
});
});
Demo .
关于node.js - 在 NodeJS 中操作数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20397840/