我有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}
.....]
请帮忙。
答案 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>