2 votes

Manipulation de données en D3.js

J'ai les données suivantes :

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"}
]

Je filtre les données pour obtenir

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"}
]

Mais je veux avoir un nouveau tableau d'objets comme :

dataNew = [
  {Vt:"35", Tv:"5"},
  {Vt:"865", Tv:"35"},
  {Vt:"75", Tv:"27"},
  {Vt:"80", Tv:"-1"}
]

Enfin, je veux utiliser dataNew pour présenter les données agrégées pour Vt (35+865+75+80) y Tv (5+35+27-1) sur un graphique circulaire.

Note Vt = Var + Temp y Tv = Temp - Var de dataFiltered .

Je ne sais vraiment pas ce qu'il faut faire après avoir filtré les données et en particulier comment obtenir dataNew .

Je laisse le code pour la partie filtrage ici aussi.

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

1voto

Code Maniac Points 29570

Vous pouvez faire correspondre ces données filtrées au format souhaité en utilisant map et que vous pouvez utiliser reduce pour obtenir un total de Tv y Vt valeurs

let 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"},]

let newData = dataFiltered.map(({Var, Temp}) => {
  let Vt = Number(Var) + Number(Temp)
  let Tv = Temp - Var
  return {Vt,Tv}  
})

console.log(newData)

let aggregateData = newData.reduce((op,{Tv,Vt})=>{
  op['Tv'] = op['Tv'] || 0
  op['Vt'] = op['Vt'] || 0
  op['Tv'] +=Tv
  op['Vt'] +=Vt
  return op
},{})

console.log(aggregateData)

1voto

Shidersz Points 15594

Vous pouvez obtenir tous les résultats dont vous avez besoin en une seule itération sur les données originales en utilisant Array.reduce() pour générer un object avec le nouveau tableau de données et les valeurs accumulées pour Vt y Tv par exemple :

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"}
];

function reduceData(data, type)
{
    return data.reduce((acc, {Name, Var, Temp}) =>
    {
        if (Name !== type)
            return acc;

        let Vt = (+Var) + (+Temp), Tv = Temp - Var;
        let len = acc.newData.push({Vt, Tv});
        acc.acc_vt += Vt;
        acc.acc_tv += Tv;
        acc.avg_tv = (acc.avg_tv * (len-1) + Tv) / len;
        acc.avg_vt = (acc.avg_vt * (len-1) + Vt) / len;
        return acc;

    }, {newData: [], acc_vt: 0, acc_tv: 0, avg_vt: 0, avg_tv: 0})
}

console.log(reduceData(data, "A"));

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X