总结&分组与Lodash

时间:2016-04-20 21:49:38

标签: javascript highcharts lodash

我是Lodash的新手,我试图通过SQL执行复杂的总和,但我找不到任何解决方案。我试图使用/组合多个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. 的产品制作群组
  3. 根据以下步骤,生成带有 data

    标记的数组

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

    2.2如果现有的总收入不存在,则包括空值

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

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

1 个答案:

答案 0 :(得分:2)

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



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);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script>
<pre id="result"></pre>
&#13;
&#13;
&#13;