使用 Lodash 进行汇总和分组

Summarize & Group By with Lodash

我是 Lodash 的新手,我正在尝试使用 group by as SQL 执行复杂的求和,但我没有找到任何解决方案。我已经尝试 use/combine 多个 Lodash 函数但没有成功。

我的要求是这样的。我有 JSON 回复:

input = 
[{"quantity":1067,"gross_revenue":4094.2,"date":"03","company":"Cat1","product":"Car"},
{"quantity":106,"gross_revenue":409,"date":"02","company":"Cat2","product":"Car"},
{"quantity":106,"gross_revenue":85,"date":"03","company":"Cat2","product":"House"},
{"quantity":106,"gross_revenue":100,"date":"02","company":"Cat3","product":"House"},
{"quantity":20,"gross_revenue":150,"date":"03","company":"Cat5","product":"Technology"},
{"quantity":40,"gross_revenue":100,"date":"01","company":"Cat5","product":"Technology"},
{"quantity":20,"gross_revenue":15,"date":"01","company":"Cat5","product":"Car"},
{"quantity":20,"gross_revenue":18,"date":"01","company":"Cat5","product":"House"},
{"quantity":20,"gross_revenue":2,"date":"01","company":"Cat2","product":"House"},
{"quantity":20,"gross_revenue":25,"date":"01","company":"Cat3","product":"House"}]

我需要生成如下结果来填充 HighChart 的系列:

[{ name: 'Car', data: [15, 409, 4094.2] },
{ name: 'House', data:[45, 100, 85] },
{ name: 'Techonology', data:[100, null, 150] }]

这些值来自:

  1. 使用带有标签 name
  2. 的 Product 创建一个组
  3. 根据以下过程,生成一个数组,标签为data

    2.1 根据产品和日期(所有现有日期)对总收入求和

    2.2 如果现有任何一天不存在总收入,则包含空值

    2.3 根据日期升序对总收入结果进行排序

这可能吗?或者还有其他解决方案吗? 谢谢

这是一种方法 - 当然不是唯一的解决方案...

var input = [
 {"quantity":1067,"gross_revenue":4094.2,"date":"03","company":"Cat1","product":"Car"},
 {"quantity":106,"gross_revenue":409,"date":"02","company":"Cat2","product":"Car"},
 {"quantity":106,"gross_revenue":85,"date":"03","company":"Cat2","product":"House"},
 {"quantity":106,"gross_revenue":100,"date":"02","company":"Cat3","product":"House"},
 {"quantity":20,"gross_revenue":150,"date":"03","company":"Cat5","product":"Technology"},
 {"quantity":40,"gross_revenue":100,"date":"01","company":"Cat5","product":"Technology"},
 {"quantity":20,"gross_revenue":15,"date":"01","company":"Cat5","product":"Car"},
 {"quantity":20,"gross_revenue":18,"date":"01","company":"Cat5","product":"House"},
 {"quantity":20,"gross_revenue":2,"date":"01","company":"Cat2","product":"House"},
 {"quantity":20,"gross_revenue":25,"date":"01","company":"Cat3","product":"House"}
];


var result = [];

var groupedByProduct = _.groupBy(input, "product");

// get the set of unique dates
var dates = _.uniq(_.map(input, 'date'));

// for each product, perform the aggregation
_.forEach(groupedByProduct, function(value, key) {
    // initialize the data array for each date
    data = [];
    for (var i = 0; i < dates.length; i++) {
        data.push(null);
    }

    // aggregate gross_revenue by date
    _.forEachRight(_.groupBy(groupedByProduct[key], "date"), function(dateValue, dateKey) {
        // use the date as an array index
        data[parseInt(dateKey) - 1] = _.sumBy(dateValue, function(o) {
            return o.gross_revenue
        });
    });
  
    // push into the result array
    result.push({"name": key, "data": data});
});

document.getElementById("result").innerHTML = JSON.stringify(result);
<script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script>
<pre id="result"></pre>