1
votes

Réduire les objets du tableau par clé et renvoyer un objet imbriqué

J'ai un tableau d'objets.

{ 
    rev : {
        2019 : [203441, 39670, 23612],
        2018 : [41289, 21315, 24095],
    },
    exp : {
        2019 : [69133, 29405, 25848],
        2018 : [23698, 25274, 25725],
    },
    profit: {
        2019 : [134308, 10265, -2236],
        2018 : [17591, -3959, -1630],
    }
}

Le but est d'abord de SOMMEZ dynamiquement toutes les valeurs clés dans un seul tableau en fonction de l'année et du monthNumber.

Le tableau d'origine n'est qu'un exemple, il y a plusieurs clés supplémentaires autres que 'exp', 'profit', etc. Je voudrais le rendre dynamique et éviter de mentionner chaque clé.

[
    {year: 2018, monthNumber: 0, rev: 203441, exp: 69133, profit: 134308}
    {year: 2019, monthNumber: 0, rev: 41289, exp: 23698, profit: 17591}
    {year: 2018, monthNumber: 1, rev: 39670, exp: 29405, profit: 10265}
    {year: 2019, monthNumber: 1, rev: 21315, exp: 25274, profit: -3959}
    {year: 2018, monthNumber: 2, rev: 23612, exp: 25848, profit: -2236}
    {year: 2019, monthNumber: 2, rev: 24095, exp: 25725, profit: -1630}
]

et ensuite atteindre le résultat souhaité ci-dessous:

let data = [
    {year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459}
    {year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849}
    {year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579}
    {year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170}
    {year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646}
    {year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381}
    {year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472}
    {year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487}
    {year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469}
    {year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233}
    {year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360}
    {year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730}
]


8 commentaires

Alors qu'avez-vous essayé?


FYI: Votre sortie est en fait incorrecte.


Honnêtement, tout ce que j'ai essayé est trop compliqué et est arrivé à des impasses, de réduire et puis pour chaque. J'espère que vous pourrez m'orienter dans la bonne direction.


qu'est-ce que la propriété EBITDA ?


reduction itère une structure de liste traitant une fonction sur chaque élément de liste, il itère. Si l'on sait que le premier argument de cette fonction fonctionne le mieux en tant qu'objet d'accumulation si c'est aussi la valeur de retour même de cette fonction alors que le deuxième argument de cette fonction est l'élément de liste, on peut maintenant proposer un processus générique qui peut à peu près réduire toute structure de données répertoriée. Alors, quelle a été votre approche génétique?


@NinaScholz ajusté


MISE À JOUR: un peu corrigé avec les valeurs de monthNumber


avez-vous besoin maintenant du résultat intermédiaire?


7 Réponses :


-3
votes

Vous devriez consulter OGX.List (téléchargeable en tant que support seul) et utilisez la fonction de groupe. Il regroupe un tableau de propriétés données. Puisque vous n'avez pas publié de code, je pense que vous cherchez une bibliothèque.


1 commentaires

Pourriez-vous expliquer ce qu'est OGX.List et montrer comment utiliser la fonction de groupe? Les réponses aux liens uniquement peuvent devenir obsolètes à l'avenir si leur lien cesse de fonctionner.



0
votes

Utilisez réduire et additionnez-les. Edit, a ajouté la possibilité de ne pas savoir quelles sont les clés.

let data = [
    {year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
    {year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
    {year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
    {year: 2019, monthNumber: 1, rev: 32354, exp: 11184, profit: 21170},
    {year: 2018, monthNumber: 1, rev: 30620, exp: 16974, EBITDA: 13646},
    {year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
    {year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
    {year: 2019, monthNumber: 2, rev: 12265, exp: 12752, profit: -487},
    {year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
    {year: 2018, monthNumber: 3, rev: 13657, exp: 13424, profit: 233},
    {year: 2019, monthNumber: 3, rev: 9050, exp: 12410, profit: -3360},
    {year: 2019, monthNumber: 3, rev: 15045, exp: 13315, profit: 1730}
]

const add = (obj, type, year, month, value) => {
  obj[type] = obj[type] || {}
  obj[type][year] = obj[type][year] || []
  obj[type][year][month] = (obj[type][year][month] || 0) + value
}

var result = data.reduce((obj, record) => {
    const {
      year,
      monthNumber,
    } = record
      const ignore = ['year', 'monthNumber']
      Object.keys(record).forEach(key => {
        if (!ignore.includes(key)){
          add(obj, key, year, monthNumber, record[key])
        }
      })
      
      return obj
    }, {}
);

console.log(result)


0 commentaires

3
votes

Vous pouvez adopter une approche dynamique et retirer year et monthNumber de l'objet pour le regroupement.

Plus tard, créez un tableau simple de l'objet.

.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459 }, { year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849 }, { year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579 }, { year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170 }, { year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646 }, { year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381 }, { year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472 }, { year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487 }, { year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469 }, { year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233 }, { year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360 }, { year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730 }],
    result = data.reduce((r, { year, monthNumber, ...o }) => {
        Object.entries(o).forEach(([k, v]) => {
            r[k] = r[k] || {};
            r[k][year] = r[k][year] || [];
            r[k][year][monthNumber] = (r[k][year][monthNumber] || 0) + v;
        });
        return r;
    }, {}),
    plain = Object.entries(result).reduce((r, [k, years]) => {
        Object.entries(years).forEach(([year, array]) => array.forEach((v, monthNumber) => {
            var temp = r.find(q => q.year === year && q.monthNumber === monthNumber);
            if (!temp) r.push(temp = { year, monthNumber });
            temp[k] = v;
        }));
        return r;
    }, []);

console.log(result);
console.log(plain);


4 commentaires

Bonjour, dans ce qui précède, où pouvons-nous inclure la somme des valeurs?


Où le voulez-vous?


Je veux d'abord additionner le rev, l'exp et le profit pour chaque année et mois


veuillez ajouter ces informations à la question dans le jeu de résultats.



0
votes
data = data.reduce(function(total, currentValue){
    let year = currentValue.year;
    let monthNumber = currentValue.monthNumber;
    if(!total.rev[year]){
        total.rev[year] = [];
        total.exp[year] = [];
        total.profit[year] = [];
    }
    if(!total.rev[year][monthNumber]){
        total.rev[year][monthNumber] = 0;
        total.exp[year][monthNumber] = 0;
        total.profit[year][monthNumber] = 0;
    }
    if(typeof currentValue.rev == "number") total.rev[year][monthNumber] += currentValue.rev;
    if(typeof currentValue.exp == "number") total.exp[year][monthNumber] += currentValue.exp;
    if(typeof currentValue.profit == "number") total.profit[year][monthNumber] += currentValue.profit;
    return total;
}, {
    rev : {},
    exp : {},
    profit : {}
});

0 commentaires

0
votes

vous pouvez parcourir toutes les valeurs et ajouter en fonction de l'année

var _data=[{year:2018,monthNumber:0,rev:40984,exp:15525,profit:25459},{year:2018,monthNumber:0,rev:162457,exp:53608,profit:108849},{year:2019,monthNumber:0,rev:8935,exp:12514,profit:-3579},{year:2019,monthNumber:0,rev:32354,exp:11184,profit:21170},{year:2018,monthNumber:1,rev:30620,exp:16974,profit:13646},{year:2018,monthNumber:1,rev:9050,exp:12431,profit:-3381},{year:2019,monthNumber:1,rev:9050,exp:12522,profit:-3472},{year:2019,monthNumber:1,rev:12265,exp:12752,profit:-487},{year:2018,monthNumber:2,rev:9955,exp:12424,profit:-2469},{year:2018,monthNumber:2,rev:13657,exp:13424,profit:233},{year:2019,monthNumber:2,rev:9050,exp:12410,profit:-3360},{year:2019,monthNumber:2,rev:15045,exp:13315,profit:1730}];

var _desired = {rev:{},exp:{},profit:{}}
_data.forEach(key=>{
  if(!_desired.rev[key.year]){
    _desired.rev[key.year] = [];
  }
  if(!_desired.exp[key.year]){
    _desired.exp[key.year] = [];
  }
  if(!_desired.profit[key.year]){
    _desired.profit[key.year] = [];
  }
  _desired.rev[key.year].push(key.rev);
  _desired.exp[key.year].push(key.exp);
  _desired.profit[key.year].push(key.profit);
})
console.log(_desired);


0 commentaires

0
votes

Essayez ceci, je ne sais pas que cela correspondra à votre objectif ou non:

let data = [
    {year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
    {year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
    {year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
    {year: 2019, monthNumber: 1, rev: 32354, exp: 11184, profit: 21170},
    {year: 2018, monthNumber: 1, rev: 30620, exp: 16974, EBITDA: 13646},
    {year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
    {year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
    {year: 2019, monthNumber: 2, rev: 12265, exp: 12752, profit: -487},
    {year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
    {year: 2018, monthNumber: 3, rev: 13657, exp: 13424, profit: 233},
    {year: 2019, monthNumber: 3, rev: 9050, exp: 12410, profit: -3360},
    {year: 2019, monthNumber: 3, rev: 15045, exp: 13315, profit: 1730}
]

var result={};

function simplearray(obj){
  //alert(obj.year);
  if(typeof result[obj.year]== "undefined")
  {
    result[obj.year]={};
  }
  if(typeof result[obj.year][obj.monthNumber]== "undefined")
  {
    result[obj.year][obj.monthNumber]={};
  }      

  if(typeof result[obj.year][obj.monthNumber]["rev"]== "undefined")
  {
    result[obj.year][obj.monthNumber]["rev"]=0;
    result[obj.year][obj.monthNumber]["exp"]=0;
    result[obj.year][obj.monthNumber]["profit"]=0;
  }      
  result[obj.year][obj.monthNumber]["rev"]+=obj.rev;
  result[obj.year][obj.monthNumber]["exp"]+=obj.exp;
  result[obj.year][obj.monthNumber]["profit"]+=obj.profit;
  
  
}

for (a=0;a<data.length;a++)
{
  simplearray(data[a]);
}   


console.log(result);
console.log(result[2018][2].rev);


0 commentaires

0
votes

La deuxième façon, si le monthNumber est bien indexé:

let data = [
    {year: 2018, monthNumber: 0, rev: 40984, exp: 15525, profit: 25459},
    {year: 2018, monthNumber: 0, rev: 162457, exp: 53608, profit: 108849},
    {year: 2019, monthNumber: 0, rev: 8935, exp: 12514, profit: -3579},
    {year: 2019, monthNumber: 0, rev: 32354, exp: 11184, profit: 21170},
    {year: 2018, monthNumber: 1, rev: 30620, exp: 16974, profit: 13646},
    {year: 2018, monthNumber: 1, rev: 9050, exp: 12431, profit: -3381},
    {year: 2019, monthNumber: 1, rev: 9050, exp: 12522, profit: -3472},
    {year: 2019, monthNumber: 1, rev: 12265, exp: 12752, profit: -487},
    {year: 2018, monthNumber: 2, rev: 9955, exp: 12424, profit: -2469},
    {year: 2018, monthNumber: 2, rev: 13657, exp: 13424, profit: 233},
    {year: 2019, monthNumber: 2, rev: 9050, exp: 12410, profit: -3360},
    {year: 2019, monthNumber: 2, rev: 15045, exp: 13315, profit: 1730}
]

var result={};

function simplearray(obj){
  if(typeof result["rev"]== "undefined")
  {
    result["rev"]={};
  }
  if(typeof result["rev"][obj.year]== "undefined")
  {
    result["rev"][obj.year]=[];
  }      

  if(typeof result["rev"][obj.year][obj.monthNumber]== "undefined")
  {
    result["rev"][obj.year][obj.monthNumber]=0;
  }      
  result["rev"][obj.year][obj.monthNumber]+=obj.rev;

  if(typeof result["exp"]== "undefined")
  {
    result["exp"]={};
  }
  if(typeof result["exp"][obj.year]== "undefined")
  {
    result["exp"][obj.year]=[];
  }      

  if(typeof result["exp"][obj.year][obj.monthNumber]== "undefined")
  {
    result["exp"][obj.year][obj.monthNumber]=0;
  }      
  result["exp"][obj.year][obj.monthNumber]+=obj.exp;
  
  if(typeof result["profit"]== "undefined")
  {
    result["profit"]={};
  }
  if(typeof result["profit"][obj.year]== "undefined")
  {
    result["profit"][obj.year]=[];
  }      

  if(typeof result["profit"][obj.year][obj.monthNumber]== "undefined")
  {
    result["profit"][obj.year][obj.monthNumber]=0;
  }      
  result["profit"][obj.year][obj.monthNumber]+=obj.profit;
}

for (a=0;a<data.length;a++)
{
  simplearray(data[a]);
}   


console.log(result);
console.log(result["profit"][2018][0]);


0 commentaires