Javascript D3.js中的数据操作

Javascript D3.js中的数据操作,javascript,arrays,object,d3.js,Javascript,Arrays,Object,D3.js,我有以下数据: var data = [ {Name:"A", Var:"15", Temp:"20",Lo:"T"}, {Name:"B", Var:"45", Temp:"40",Lo:"F"}, {Name:"B", Var:"63", Temp:"340",Lo:"T"}, {Name:"A", Var:"415", Temp:"450",Lo:"F"}, {Name:"B", Var:"405", Temp:"940",Lo:"F"}, {Name:"B", V

我有以下数据:

var data = [
  {Name:"A", Var:"15", Temp:"20",Lo:"T"},
  {Name:"B", Var:"45", Temp:"40",Lo:"F"},
  {Name:"B", Var:"63", Temp:"340",Lo:"T"},
  {Name:"A", Var:"415", Temp:"450",Lo:"F"},
  {Name:"B", Var:"405", Temp:"940",Lo:"F"},
  {Name:"B", Var:"415", Temp:"410",Lo:"T"},
  {Name:"A", Var:"24", Temp:"51",Lo:"T"},
  {Name:"C", Var:"43", Temp:"40",Lo:"T"},
  {Name:"A", Var:"41", Temp:"40",Lo:"F"}
]
我过滤数据以获取

dataFiltered = [
  {Name:"A", Var:"15", Temp:"20",Lo:"T"},
  {Name:"A", Var:"415", Temp:"450",Lo:"F"},
  {Name:"A", Var:"24", Temp:"51",Lo:"T"},
  {Name:"A", Var:"41", Temp:"40",Lo:"F"}
]
但我想要一个新的对象数组,比如:

dataNew = [
  {Vt:"35", Tv:"5"},
  {Vt:"865", Tv:"35"},
  {Vt:"75", Tv:"27"},
  {Vt:"80", Tv:"-1"}
]
最后,我想使用
dataNew
在饼图上显示
Vt(35+865+75+80)
Tv(5+35+27-1)
的聚合数据

注意
Vt=Var+Temp
Tv=Temp-Var
来自
dataFiltered

我真的不知道过滤数据后该怎么做,尤其是如何获取
dataNew

我把过滤部分的代码也留在这里

var filteredData = data.filter(function(d) {
    return d.Name == "A";
});

您可以使用
map
将过滤后的数据映射到所需格式,然后使用
reduce
获得
Tv
Vt
值的总和

让数据过滤=[{Name:“A”,Var:“15”,Temp:“20”,Lo:“T”},{Name:“A”,Var:“415”,Temp:“450”,Lo:“F”},{Name:“A”,Var:“24”,Temp:“51”,Lo:“T”},{Name:“A”,Var:“41”,Temp:“40”,Lo:“F”},]
让newData=dataFiltered.map(({Var,Temp})=>{
设Vt=编号(Var)+编号(Temp)
设Tv=Temp-Var
返回{Vt,Tv}
})
console.log(newData)
让aggregateData=newData.reduce((op,{Tv,Vt})=>{
op['Tv']=op['Tv']| 0
op['Vt']=op['Vt']| | 0
op['Tv']+=Tv
op['Vt']+=Vt
返回操作
},{})

console.log(aggregateData)
您可以在原始数据的一次迭代中获得所需的所有输出,使用新的数据数组和Vt和Tv的累积值生成
对象,例如:

var数据=[
{名称:“A”,变量:“15”,临时变量:“20”,Lo:“T”},
{名称:“B”,变量:“45”,临时变量:“40”,Lo:“F”},
{名称:“B”,变量:“63”,临时变量:“340”,Lo:“T”},
{名称:“A”,变量:“415”,临时变量:“450”,Lo:“F”},
{名称:“B”,变量:“405”,临时变量:“940”,Lo:“F”},
{名称:“B”,变量:“415”,临时变量:“410”,Lo:“T”},
{名称:“A”,变量:“24”,临时变量:“51”,Lo:“T”},
{名称:“C”,变量:“43”,临时变量:“40”,Lo:“T”},
{名称:“A”,变量:“41”,临时变量:“40”,Lo:“F”}
];
函数简化数据(数据,类型)
{
返回数据.reduce((acc,{Name,Var,Temp})=>
{
如果(名称!==类型)
返回acc;
设Vt=(+Var)+(+Temp),Tv=Temp-Var;
设len=acc.newData.push({Vt,Tv});
acc.acc_vt+=vt;
acc.acc_tv+=电视;
acc.avg_tv=(acc.avg_tv*(len-1)+tv)/len;
acc.avg_vt=(acc.avg_vt*(len-1)+vt)/len;
返回acc;
},{newData:[],acc_vt:0,acc_tv:0,avg_vt:0,avg_tv:0})
}
console.log(reduceData(数据,“A”))
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装器{max height:100%!important;top:0;}
我是否需要像您那样重新定义dataFiltered,或者从原始数据开始,然后执行筛选,并使用data.filter()给定的dataFiltered是否足够。@Mathnewbie否可以从原始数据开始,然后进行筛选,我刚刚给出了一些您面临问题的例子,您可以将这些东西合并到您的代码中where@Mathnewbie你可以通过除以total/filteredData.length来计算平均值,你应该在aggregateData之后进行计算,它应该是length而不是length,你应该做的第二件事是聚合data.Tv/newData.length以获得平均的Tv,这和你计算Vt的方法相同,@Mathnewbie你需要以所需的库形式拥有数据结构,你不能只处理任何随机的数据结构哇!这是一种非常有效的方法。还有一种有效的方法可以对vt和tv的不同值进行平均。目前,我看到您使用acc.acc\u vt和acc.acc\u tv进行聚合(求和)。是否有一种方法可以在不将聚合数据除以长度(acc.acc_tv/length)的情况下进行平均。类似于均值函数的东西。@Mathnewbie我也更新了迭代计算平均值的功能,但我不确定你是否在哪里找到它。谢谢!它工作得很好。我认为有一种方法可以不迭代地完成,但这很有效,所以我可能会使用它。对于问题的第二部分,以及如何使用acc_vt(或avg_vt)和acc_tv(或avg_tv)获得饼图,你有什么想法吗?嗯,如果你这样做,你可以得到平均值,例如,让avg_vt=acc_vt/newData.length
reduce()
的返回对象中,说到实现的第一个版本。我不熟悉D3库,但可以肯定的是,应该有关于如何制作饼图的教程。