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 }, ]
3 Réponses :
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.
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))
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.
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);