我在Jquery中总结和分组我的对象时遇到了问题,因为我希望按国家/地区进行分组,然后根据子期间4,5和6对col1中的值进行总计。 col1,col2,col3是动态的,但使用它就是一个例子。
我需要的是获取存储在国家/地区变量中的国家/地区总数,存储在columns变量中的每个子期间的总计,以及存储在averages变量中的总计数。
这是我在jsfiddle中的代码:
我的对象:
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
}
}
我想尽可能地坚持我的代码。 谢谢,谢谢你的帮助。
答案 0 :(得分:1)
这应该可以解决问题:
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];