Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 使用Linq.js对JSON数据的多个字段进行求和和和分组_Jquery_Json_Linq.js - Fatal编程技术网

Jquery 使用Linq.js对JSON数据的多个字段进行求和和和分组

Jquery 使用Linq.js对JSON数据的多个字段进行求和和和分组,jquery,json,linq.js,Jquery,Json,Linq.js,我有一个JSON数据,我需要分组并求和数据。假设我有一个json对象,如下所示: var dataString='[{"Company":"ABC","Focus":"Operate","Completed":"50","Remaining":"25"},{"Company":"ABC","Focus":"Operate","Completed":"20","Remaining":"50"},{"Company":"DEF","Focus":"Optimize","Completed":"100

我有一个JSON数据,我需要分组并求和数据。假设我有一个json对象,如下所示:

var dataString='[{"Company":"ABC","Focus":"Operate","Completed":"50","Remaining":"25"},{"Company":"ABC","Focus":"Operate","Completed":"20","Remaining":"50"},{"Company":"DEF","Focus":"Optimize","Completed":"100","Remaining":"75"},{"Company":"XYZ","Focus":"Innovate","Completed":"100","Remaining":"75"},{"Company":"ABC","Focus":"Improve","Completed":"50","Remaining":"50"},{"Company":"ABC","Focus":"Optimize","Completed":"50","Remaining":"25"},{"Company":"DEF","Focus":"Operate","Completed":"50","Remaining":"25"},{"Company":"ABC","Focus":"Improve","Completed":"50","Remaining":"25"},{"Company":"XYZ","Focus":"Operate","Completed":"50","Remaining":"25"},{"Company":"XYZ","Focus":"Operate","Completed":"50","Remaining":"25"},{"Company":"XYZ","Focus":"Optimize","Completed":"20","Remaining":"50"}]';

数组在一个数组中,第一个数组应该包含公司,在另一个数组中应该包含我的焦点区域中已完成和剩余数据的总和

Company: 
   1. ABC --Focus -- 1.Operate  -- Completed :70 ,Remaining:75
                     2.Improve    -- Completed:100 ,Remaining:75
                     3.Optimize -- Completed:50 ,Remaining:25

   2. DEF--Focus-- 1.Operate  -- Completed:50 ,Remaining:25
                   2.Optimize -- Completed:100 ,Remaining:75  

   3. XYZ--Focus-- 1.Innovate  -- Completed:100 ,Remaining:75
                   2.Operate    -- Completed:100 ,Remaining:50
                   3.Optimize -- Completed:20 ,Remaining:50 
我尝试了以下查询来实现这一点:

  var resultxyz = Enumerable.From(dataString).GroupBy("$.Company", null,
    function (key, g) {
    var resultxyz = {
        z: key,
        totalCompleted: g.Sum("$.Completed"),
        totalRemaining: g.Sum("$.Remaining")

    }
    return resultxyz ;
}).ToArray();
但这只是对公司进行分组,我也必须关注焦点。
任何想法或建议都会大有裨益。

基本上,您正在寻找一个双层分组。首先,对所有公司进行总体分组,在每个分组中,对焦点进行分组。有许多不同的建模方法,但最直接的方法是:

var query = Enumerable.From(data)
    .GroupBy("$.Company", null,
        function (key, g) {
            return {
                Company: key,
                Result: Enumerable.From(g)
                    .GroupBy("$.Focus", null,
                        "{ Focus: $, Completed: $$.Sum('Number($.Completed)'), Remaining: $$.Sum('Number($.Remaining)') }"
                    )
                    .ToArray()
            };
        }
    )
    .ToArray();

注意
Number()
函数的使用。由于
已完成的
剩余的
属性都是字符串,因此求和不会像预期的那样有效。我们需要事先将它们转换成数字。

非常感谢杰夫,这正是我想要的:):)