node.js - 在 NodeJS 中操作数据的最佳方法是什么?

标签 node.js mapreduce underscore.js

我正在编写一个从广告平台获取一些数据的应用程序。我的数据结构如下所示:

{
  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/

相关文章:

java - Hadoop MapReduce- reducer 未运行

java - SecondarySort -OverrideError(删除注释)

javascript - 异步加载下划线模板的最佳方式

java - Hadoop 命令行配置不覆盖默认值?

Lodash Wrapper 对象上的 Javascript 划分

javascript - 寻找更有效的方法来设置和更改顺序 Backbone 模型属性

node.js - 使用express、mongodb和mongoose进行本地开发

node.js - 如何在dynamodb中使用in运算符

javascript - 如何从 Javascript 客户端发送多个 Socket IO socket.handshake.query 值

node.js - 如何从socket.io获取 native 事件数组?