2
votes

Liste réduite JS basée sur l'une de ses propriétés

J'écris une méthode dans react js, disons que j'ai une liste comme ci-dessous.

itemList.reduce((a, b) => ({ date: a.AnnaIncome + b.AnnaIncome, a.PeterIncome + b.PeterIncome, a.KenIncome + b.KenIncome, a.freeCash + b.freeCash }));

Je souhaite faire un .reduce afin que la liste contienne moins d'éléments juste par propriété de date. Par exemple, dans la liste ci-dessus, il n'y a en fait que deux dates 22/01/2019 et 23/01/2019. Je souhaite réduire la taille de la liste par la date de chaque objet. Ainsi, le revenu de chaque personne s'additionnerait sous son propre nom. Finalement, la liste deviendrait seulement 2 objets. Et certaines propriétés sont supprimées de la nouvelle liste par exemple ci-dessous, 'id' et 'tillpoint' sont supprimés, et le reste des propriétés s'additionnent:

let itemList = [
    {
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 250,
        "KenIncome": 200,
        "freeCash": 80
    },
    {
        "date": "22/01/2019",
        "AnnaIncome": 220,
        "PeterIncome": 280,
        "KenIncome": 80,
        "freeCash": 110
    }
]

Ce que j'ai essayé ici est quelque chose comme ci-dessous, mais c'est Ca ne fonctionne pas.

const itemList = [
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "23/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 50,
        "KenIncome": 100,
        "freeCash": 30
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 200,
        "KenIncome": 100,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "22/01/2019",
        "AnnaIncome": 120,
        "PeterIncome": 120,
        "KenIncome": 30,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "22/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 150,
        "KenIncome": 50,
        "freeCash": 60
    },
] 


0 commentaires

3 Réponses :


2
votes

Vous devez regrouper par date, ce qui peut facilement être fait en utilisant une table de hachage:

 const byDate = new Map;

 for(const { date, id, tillPoint, ...rest } of itemList) {
   if(byDate.has(date)) {
     const dupe = byDate.get(date);
     for(const [k, v] of Object.entries(rest))
       dupe[k] += v;
   } else {
     byDate.set(date, { date, ...rest });
   }
}

const result = [...byDate.values()];

Vous pouvez certainement coder facilement les ajouts comme dupe.something + = rest.something si les performances comptent autant.


0 commentaires

2
votes

Vous pouvez utiliser réduire a > et l'opérateur spread .

Donc, ici, je prends les propriétés dynamiques que vous souhaitez ajouter directement à votre sortie sans aucune manipulation dans ... reste et je retire les noms respectifs.

Ensuite, je vérifie si la clé de données est déjà là, j'ajoute le ... reste et ajoute freeCash à la valeur existante. Sinon, nous créons une nouvelle clé avec la date et la valeur respective.

const itemList = [{"id":3295042,"tillPoint":"A","date":"23/01/2019","AnnaIncome":100,"PeterIncome":50,"KenIncom":100,"freeCash":30},{"id":3295042,"tillPoint":"B","date":"23/01/2019","AnnaIncome":300,"PeterIncome":200,"KenIncom":100,"freeCash":50},{"id":3295042,"tillPoint":"A","date":"22/01/2019","AnnaIncome":120,"PeterIncome":120,"KenIncom":30,"freeCash":50},{"id":3295042,"tillPoint":"B","date":"22/01/2019","AnnaIncome":100,"PeterIncome":150,"KenIncom":50,"freeCash":60},]

const op = itemList.reduce((output,current)=>{
  let {id,tillPoint,date,freeCash,...rest} = current
 
  if(output[date]){
    output[date] = {
      ...output[date],
      ...rest,
      date,
      freeCash: output[date].freeCash +freeCash
    }
  } else {
    output[date] ={
      ...rest,
      date,
      freeCash
    }
  }
  return output
},{})

console.log(Object.values(op))


1 commentaires

Curieux de savoir à quoi servait le vote négatif, cela me semble être une réponse raisonnable qui démontre l'utilisation de réduire.



1
votes

Peut-être comme ceci:

const itemList = [
    { "id": 3295042, "tillPoint": "A", "date": "23/01/2019", "AnnaIncome": 100, "PeterIncome": 50,  "KenIncome": 100, "freeCash": 30 },
    { "id": 3295042, "tillPoint": "B", "date": "23/01/2019", "AnnaIncome": 300, "PeterIncome": 200, "KenIncome": 100, "freeCash": 50 },
    { "id": 3295042, "tillPoint": "A", "date": "22/01/2019", "AnnaIncome": 120, "PeterIncome": 120, "KenIncome": 30,  "freeCash": 50 },
    { "id": 3295042, "tillPoint": "B", "date": "22/01/2019", "AnnaIncome": 100, "PeterIncome": 150, "KenIncome": 50,  "freeCash": 60 },
];


var new_itemList=[];

for(var key in itemList){
	var new_key = -1;
	for(var keyn in new_itemList){
	   if(new_itemList[keyn].date == itemList[key].date){
	   	  new_key = parseInt(keyn, 10);
	   }
	}
	if(new_key == -1){
		new_itemList.push({'date':itemList[key].date, 'AnnaIncome': itemList[key].AnnaIncome, 'PeterIncome': itemList[key].PeterIncome, 'KenIncome': itemList[key].KenIncome, 'freeCash': itemList[key].freeCash});
	}else{
       new_itemList[new_key].AnnaIncome +=  itemList[key].AnnaIncome;
       new_itemList[new_key].PeterIncome +=  itemList[key].PeterIncome;
       new_itemList[new_key].KenIncome +=  itemList[key].KenIncome;
       new_itemList[new_key].freeCash +=  itemList[key].freeCash;
	}
}
console.log(new_itemList);


0 commentaires