【问题标题】:Group by and aggregation on JSON array using Underscore JS使用 Underscore JS 对 JSON 数组进行分组和聚合
【发布时间】:2014-05-22 03:42:24
【问题描述】:

我有一个 json 数组对象。我想根据列“FlexCategoryName”按数据分组,并对矩阵列执行聚合,例如“成本”的平均值、“点击次数”的总和等。下面是 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

VENUE_ID: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

【问题讨论】:

    标签: javascript arrays json underscore.js


    【解决方案1】:
    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 。例如 .groupBy("FlexCategoryName").groupBy("VENUE_ID") 但它总是根据 FlexCategoryName 显示分组依据。我也试过 .groupBy("FlexCategoryName VENUE_ID") 和 .groupBy("FlexCategoryName ,"VENUE_ID") 但它不起作用
    • 已编辑问题。我想对超过 1 列的 grouby 执行与我们在 sql server 中执行相同的操作
    • @Shailesh 不,这改变了问题的原意,使我的回答毫无用处。我正在恢复您的更改。请重新正确编辑
    • 我可以根据 n 级列进行分组吗?因为我可以有 1,2 ,3 ..n 列进行分组。我正在挖掘你的代码。
    • @Shailesh 我认为值得单独提问。
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2018-03-19
    • 2021-09-17
    • 2017-02-14
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多