使用linq.js,我需要按2个字段分组并生成摘要

时间:2017-04-07 10:24:14

标签: javascript linq group-by lodash

我有json作为

var obj = [{projectName:"Test1", catName: "subTest1, marks1: 25, marks2: 45},
{projectName:"Test1", catName: "subTest1", marks1: 45, marks2: 45},
{projectName:"Test1", catName: "subTest2", marks1: 25, marks2: 45}
{projectName:"Test1", catName: "subTest2", marks1: 15, marks2: 25},
{projectName:"Test2", catName: "subTest1", marks1: 35, marks2: 45}
{projectName:"Test2", catName: "subTest2", marks1: 20, marks2: 55}
{projectName:"Test2", catName: "subTest2", marks1: 25, marks2: 65}

]

我需要按projectName和catName进行分组,并对每个标记求和,得到如下结果

result = [{projectName:"Test1", catName: "subTest1", marks1: 70, marks2: 90},
{projectName:"Test1", catName: "subTest2", marks1: 40, marks2: 70}
.....]

请帮忙。

1 个答案:

答案 0 :(得分:1)

在普通的Javascript中,您可以使用哈希表作为同一组的参考,并收集想要的数据。

var data = [{ projectName: "Test1", catName: "subTest1", marks1: 25, marks2: 45 }, { projectName: "Test1", catName: "subTest1", marks1: 45, marks2: 45 }, { projectName: "Test1", catName: "subTest2", marks1: 25, marks2: 45 }, { projectName: "Test1", catName: "subTest2", marks1: 15, marks2: 25 }, { projectName: "Test2", catName: "subTest1", marks1: 35, marks2: 45 }, { projectName: "Test2", catName: "subTest2", marks1: 20, marks2: 55 }, { projectName: "Test2", catName: "subTest2", marks1: 25, marks2: 65 }],
    groups = ['projectName', 'catName'],
    values = ['marks1', 'marks2'],
    grouped = data.reduce(function (hash) {
        return function (r, a) {
            var key = groups.map(function (k) { return a[k]; }).join('|');
            if (!hash[key]) {
                hash[key] = {};
                groups.forEach(function (k) { hash[key][k] = a[k]; });
                values.forEach(function (k) { hash[key][k] = 0; });
                r.push(hash[key]);
            }
            values.forEach(function (k) { hash[key][k] += a[k]; });
            return r;
        };
    }(Object.create(null)), []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

带linq.js的版本

var data = [{ projectName: "Test1", catName: "subTest1", marks1: 25, marks2: 45 }, { projectName: "Test1", catName: "subTest1", marks1: 45, marks2: 45 }, { projectName: "Test1", catName: "subTest2", marks1: 25, marks2: 45 }, { projectName: "Test1", catName: "subTest2", marks1: 15, marks2: 25 }, { projectName: "Test2", catName: "subTest1", marks1: 35, marks2: 45 }, { projectName: "Test2", catName: "subTest2", marks1: 20, marks2: 55 }, { projectName: "Test2", catName: "subTest2", marks1: 25, marks2: 65 }],
    result = Enumerable.From(data)
        .GroupBy(
            null,
            null,
            "{ projectName: $.projectName, catName: $.catName, marks1: $$.Sum('$.marks1'), marks2: $$.Sum('$.marks2') }",
            "$.projectName + ' ' + $.catName"
        )
        .ToArray();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>