Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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
Javascript 按对象数组中的所有键分组并聚合_Javascript_D3.js - Fatal编程技术网

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感谢您接受答案!我仔细考虑了你的问题,实际上想出了一个更好(更简洁)的解决方案:请参阅更新的答案和“替代解决方案”部分:)