Javascript 按对象数组中的所有键分组并聚合
我有一个对象数组,每个对象都有多个键和值对。我想根据第一个键的值进行分组,然后得出聚合平均值和中值 我可以用嵌套和汇总来实现这一点,但仅限于一维。例如,下面的例子是,按Javascript 按对象数组中的所有键分组并聚合,javascript,d3.js,Javascript,D3.js,我有一个对象数组,每个对象都有多个键和值对。我想根据第一个键的值进行分组,然后得出聚合平均值和中值 我可以用嵌套和汇总来实现这一点,但仅限于一维。例如,下面的例子是,按winner分组,然后为每个子组找到平均值/中位数,但仅在一个维度上,在本例中仅在团队4上。是否有一种方法可以同时聚合所有四个团队1、团队2、团队3、团队4?作为旁注,team.1、team.2、team.3、team.4事先不知道 我想要的输出(但在这方面非常灵活,这只是一个“很好拥有”)是 var avg=[ { 'winn
winner
分组,然后为每个子组找到平均值/中位数,但仅在一个维度上,在本例中仅在团队4上。是否有一种方法可以同时聚合所有四个团队1、团队2、团队3、团队4
?作为旁注,team.1、team.2、team.3、team.4
事先不知道
我想要的输出(但在这方面非常灵活,这只是一个“很好拥有”)是
var avg=[
{ 'winner': 'team.1', 'team.1' : 4, 'team.2' : 5.333, 'team.3': 1, 'team.4': 0.666},
{ 'winner': 'team.2', 'team.1' : 6, 'team.2' : 2.5, 'team.3': 6.5, 'team.4': 0.5}
];
中位数也是如此
谢谢
var数据=[];
数据[0]={'winner':'team.1','team.1':5,'team.2':4,'team.3':1,'team.4':0},
数据[1]={'winner':'team.2','team.1':5,'team.2':1,'team.3':4,'team.4':1},
数据[2]={'winner':'team.2','team.1':7,'team.2':4,'team.3':9,'team.4':0},
数据[3]={'winner':'team.1','team.1':5,'team.2':8,'team.3':0,'team.4':1},
数据[4]={'winner':'team.1','team.1':2,'team.2':4,'team.3':2,'team.4':1}
var dim=‘团队4’;
var out=d3.nest()
.key(函数(d){返回d.winner;})
.rollup(函数(v){返回{
尺寸:暗淡,
计数:v.length,
中值:d3.中值(v,函数(d){返回d[dim];}),
平均值:d3.平均值(v,函数(d){返回d[dim];})
}; })
.条目(数据);
控制台。注销;
由于您有双重嵌套的数据,因此必须在第一个汇总函数中嵌套另一级别的汇总函数。因此,您的顶级汇总应该有一个如下所示的回调:
// Iterate through the object, remove the winner
// That will leave us an object containing team-score key-value pairs
// And then, we flatten the array down to a single dimension:
var teams = v.map(function(team) {
delete team.winner;
return d3.entries(team);
}).reduce(function(memo, team) {
return memo.concat(team);
}, []);
// Generate the summary for the winner group
// We have an array of objects of all the scores of all teams that the winning team has played against
var groupSummary = d3.nest()
.key(function(d) { return d.key; })
.rollup(function(w) {
return {
count: w.length,
median: d3.median(w, function(d) {
return d['value'];
}),
avg: d3.mean(w, function(d) {
return d['value'];
})
};
})
.entries(teams);
// Return the summary to the top-level rollup
return groupSummary;
var数据=[];
数据[0]={
“获胜者”:团队1,
“团队1”:5,
“团队2”:4,
“团队3”:1,
“团队4”:0
},
数据[1]={
“获胜者”:“团队2”,
“团队1”:5,
“团队2”:1,
“团队3”:4,
“团队4”:1
},
数据[2]={
“获胜者”:“团队2”,
“团队1”:7,
“团队2”:4,
“3队”:9,
“团队4”:0
},
数据[3]={
“获胜者”:团队1,
“团队1”:5,
“团队2”:8,
“团队3”:0,
“团队4”:1
},
数据[4]={
“获胜者”:团队1,
“团队1”:2,
“团队2”:4,
“团队3”:2,
“团队4”:1
}
var dim=‘团队4’;
var out=d3.nest()
.键(功能(d){
返回d.winner;
})
.汇总(功能(v){
var团队=v.map(功能(团队){
删除team.winner;
返回d3.条目(团队);
}).减少(职能部门(备忘录、团队){
返回备忘录。concat(团队);
}, []);
var a=d3.nest()
.key(函数(d){return d.key;})
.汇总(功能(w){
返回{
计数:w.length,
中位数:d3。中位数(w,函数(d){
返回d['value'];
}),
平均值:d3.平均值(w,函数(d){
返回d['value'];
})
};
})
.参赛作品(小组);
返回a;
})
.条目(数据);
控制台。注销;
@Aenaon感谢您接受答案!我仔细考虑了你的问题,实际上想出了一个更好(更简洁)的解决方案:请参阅更新的答案和“替代解决方案”部分:)