使用Underscore JS对JSON数组进行分组和聚合

9

我有一个JSON数组对象。我希望按照“FlexCategoryName”列对数据进行分组,并对矩阵列执行聚合,例如“cost”的平均值,“clicks”的总和等。以下是JSON数组对象:

Array[100]
0: Object
1: Object
2: Object
3: Object

0: 对象

Clicks: 1067
Cost: 4094.2
Date: "2/8/2014"
FlexCategoryName: "Cat1"
Impressions: 65943
Leads: 20

地点编号:1

1:对象

Clicks: 106
Cost: 409
Date: "2/8/2014"
FlexCategoryName: "Cat2"
Impressions: 65941
Leads: 21
VENUE_ID:1

2:对象

Clicks: 106
Cost: 409
Date: "2/8/2014"
FlexCategoryName: "Cat2"
Impressions: 10
Leads: 21
VENUE_ID:2

3: 对象

Clicks: 106
Cost: 409
Date: "2/8/2014"
FlexCategoryName: "Cat3"
Impressions: 10
Leads: 21
VENUE_ID:2

4: 对象

Clicks: 20
Cost: 10
Date: "2/8/2014"
FlexCategoryName: "Cat5"
Impressions: 10
Leads: 21
 VENUE_ID:3

如何使用Underscore JS对矩阵列进行分组和聚合。
期望输出。
0: Object
Cost: sum of all cost based on FlexCategoryName Cat1
FlexCategoryName: "Cat1"
Impressions: sum of all Impressions based on FlexCategoryName Cat1

1: Object
Cost: sum of all cost based on FlexCategoryName Cat2
FlexCategoryName: "Cat2"
Impressions: sum of all Impressions based on FlexCategoryName Cat2
1个回答

27
var _ = require("underscore");
function sum(numbers) {
    return _.reduce(numbers, function(result, current) {
        return result + parseFloat(current);
    }, 0);
}
var result = _.chain(data)
    .groupBy("FlexCategoryName")
    .map(function(value, key) {
        return {
            FlexCategoryName: key,
            Cost: sum(_.pluck(value, "Cost")),
            Impressions: sum(_.pluck(value, "Impressions"))
        }
    })
    .value();

console.log(result);

输出

[ { FlexCategoryName: 'Cat1', Cost: 4094.2, Impressions: 65943 },
  { FlexCategoryName: 'Cat2', Cost: 818, Impressions: 65951 },
  { FlexCategoryName: 'Cat3', Cost: 409, Impressions: 10 },
  { FlexCategoryName: 'Cat5', Cost: 10, Impressions: 10 } ]

如果您想查找平均值而不是总和,则只需更改函数。

编辑:如果您要基于多个字段进行分组,则可以像这样嵌套分组。

var result = _.chain(data)
    .groupBy("FlexCategoryName")
    .map(function(value, key) {
        return _.chain(value)
            .groupBy("VENUE_ID")
            .map(function(value1, venue_id) {
                return {
                    FlexCategoryName: key,
                    Cost: sum(_.pluck(value1, "Cost")),
                    Impressions: sum(_.pluck(value1, "Impressions")),
                    VENUE_ID: venue_id
                }
            })
            .value();
    })
    .value();

我正在尝试对两列进行分组,例如:.groupBy("FlexCategoryName").groupBy("VENUE_ID")。但它总是按照FlexCategoryName进行分组。我还尝试了.groupBy("FlexCategoryName VENUE_ID")和.groupBy("FlexCategoryName,"VENUE_ID"),但都没有起作用。 - Shailesh
修改后的问题。我想执行与 SQL Server 中对多个列进行分组相同的操作。 - Shailesh
@Shailesh 不是的,这样会改变问题的原意,使我的回答变得无用。我会撤销你的更改,请再次进行适当编辑。 - thefourtheye
我能否基于n级列进行分组?因为我可能有1、2、3...n个分组列。我正在研究你的代码。 - Shailesh
@Shailesh 我认为这值得单独提出一个问题。 - thefourtheye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接