在Jquery中汇总和分组JSON对象

我在Jquery中总结和分组我的对象时遇到了问题,因为我希望按国家/地区进行分组,然后根据子期间4,5和6对col1中的值进行总计。 col1,col2,col3是动态的,但使用它就是一个例子。

我需要的是获得存储在国家变量中的国家总数,存储在columns变量中的每个子期间的总计,以及存储在averages变量中的总计数。

这是我在jsfiddle中的代码:

http://jsfiddle.net/8vVK7/8/

我的目标:

var g_jsonData = [ { "Country": "Spain", "Year": "2000", "Subperiod": "4", "col1": "75", "col2": "500", "col3": "200" }, { "Country": "Spain", "Year": "2001", "Subperiod": "4", "col1": "50", "col2": "500", "col3": "300" }, { "Country": "Spain", "Year": "2002", "Subperiod": "4", "col1": "50", "col2": "200", "col3": "300" }, { "Country": "Spain", "Year": "2003", "Subperiod": "4", "col1": "", "col2": "200", "col3": "300" }, { "Country": "Spain", "Year": "2005", "Subperiod": "5", "col1": "125", "col2": "500", "col3": "300" }, { "Country": "Spain", "Year": "2012", "Subperiod": "6", "col1": "100.75", "col2": "500", "col3": "200" }, { "Country": "Spain", "Year": "2013", "Subperiod": "6", "col1": "200", "col2": "500", "col3": "300" }, { "Country": "France", "Year": "2000", "Subperiod": "4", "col1": "100", "col2": "100", "col3": "300" }, { "Country": "France", "Year": "2001", "Subperiod": "4", "col1": "100", "col2": "100", "col3": "300" }, { "Country": "France", "Year": "2002", "Subperiod": "4", "col1": "100", "col2": "200", "col3": "300" }, { "Country": "France", "Year": "2005", "Subperiod": "5", "col1": "100", "col2": "200", "col3": "300" }, { "Country": "France", "Year": "2012", "Subperiod": "6", "col1": "100", "col2": "100", "col3": "300" }, { "Country": "France", "Year": "2013", "Subperiod": "6", "col1": "100", "col2": "100", "col3": "300" }]; 

以下是我想得到的最终结果,这是基于每个国家/地区的每个子期间的col1汇总。

 countries = { "Spain":{ "4":175, "5":125, "6":300.75 }, "France":{ "4":300, "5":100, "6":200, } } 

子期间4,5,6的总计应显示为:

 columns = { "4":475, "5":225, "6":500.75 } 

我还希望获得每个国家/地区的总计数,每个子期间:

 averages = { "Spain":{ "4":3, "5":1, "6":2 }, "France":{ "4":3, "5":1, "6":2 } } 

我想尽可能地坚持我的代码。 谢谢,谢谢你的帮助。

这应该是诀窍:

 g_jsonData.reduce(function(out, curr){ // Make sure the current country exists on the output object. // Then add the current object's col1 to the current country's subperiod, // checking to see if the current subperiod exists. Also, cast the `col1` to int `(+curr.col1)` out.countries[curr.Country] = out.countries[curr.Country] || {}; out.countries[curr.Country][curr.Subperiod] = (out.countries[curr.Country][curr.Subperiod] || 0) + (+curr.col1); // And add it to the total, too. out.columns[curr.Subperiod] = (out.columns[curr.Subperiod] || 0) + (+curr.col1); // Count occurences out.count[curr.Country] = out.count[curr.Country] || {}; out.count[curr.Country][curr.Subperiod] = (out.count[curr.Country][curr.Subperiod] || 0) + 1; return out; }, {'columns':{},'countries':{},'count':{}}); // second parameter to `reduce` is a default object, in this case: `{'columns':{},'countries':{},'count':{}}}` 

返回:

 { "columns": { "4": 475, "5": 225, "6": 500.75 }, "countries": { "Spain": { "4": 175, "5": 125, "6": 300.75 }, "France": { "4": 300, "5": 100, "6": 200 } }, "count": { "Spain": { "4": 3, "5": 1, "6": 2 }, "France": { "4": 3, "5": 1, "6": 2 } } } 

请注意,这不会改变 g_jsonData ,它只返回新对象。
要使用新对象,您必须将其分配给变量,当然:

 var output = g_jsonData.reduce(func....); 

您可以使代码更短(/更容易查看),如下所示:

 g_jsonData.reduce(function(out, curr){ var c = curr.Country, s = curr.Subperiod, v = +curr.col1; //value cast to int already out.countries[c] = out.countries[c] || {}; out.countries[c][s] = (out.countries[c][s] || 0 ) + v; out.count[c] = out.count[c] || {}; out.count[c][s] = (out.count[c][s] || 0 ) + 1; out.columns[s] = (out.columns[s] || 0 ) + v; return out; }, {'columns':{},'countries':{},'count':{}}); 

现在,将col1变为变量名称相对容易。
更换:

 v = +curr.col1; 

附:

 v = +curr['col1']; 

要么:

 v = +curr[someVariable];