2017-04-07 30 views
1

我有JSON作为使用linq.js,我需要组由2个字段和产生摘要

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

在简单的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>