Je veux faire un éventail d'objets groupés par la propriété de date.
result = [ { Date: "28/05/20", "(60-100)": 2, "(4-6)": 1 }, { Date: "29/05/20", "(38-43)": 1, "(4-6)": 1, "(60-100)": 1 }, { Date: "30/05/20", "(38-43)": 2 }, ]
4 Réponses :
Essayez ceci:
result=={ "28/05/20": { "(60-100)": 2, "(4-6)": 1 }, "29/05/20": { "(60-100)": 1, "(38-43)": 1, "(4-6)": 1 }, "30/05/20": { "(38-43)": 2 } }
Donnez cela un essai.
let data = [ { Age: "(60-100)", Date: "28/05/20" }, { Age: "(60-100)", Date: "28/05/20" }, { Age: "(4-6)", Date: "28/05/20" }, { Age: "(60-100)", Date: "29/05/20" }, { Age: "(38-43)", Date: "29/05/20" }, { Age: "(4-6)", Date: "29/05/20" }, { Age: "(38-43)", Date: "30/05/20" }, { Age: "(38-43)", Date: "30/05/20" } ]; let res = []; data.map((d, index) => { if (!res.some(val => val.Date === d.Date)) { d[`${d.Age}`] = 1 res.push(d) delete(d.Age) } else { let index = res.findIndex(val => val.Date == d.Date); let _d = res[index]; if (_d.hasOwnProperty(`${d.Age}`)) { _d[`${d.Age}`] = parseInt(_d[`${d.Age}`] + 1) } else { _d[`${d.Age}`] = 1 } res[index] = _d; } }) console.log(res)
Essayez ceci:
function groupByDate(data){ let groupedData = []; data.forEach(element => { //Search for the object containing the specified date let objIndex = groupedData.findIndex(object => {return object.Date == element.Date;}) //If date is not created, create it if (objIndex == -1){ groupedData.unshift({Date: element.Date}) objIndex = 0; } //If age is not created, create it. Else add 1 to specified age. if(typeof groupedData[objIndex][element.Age] == 'undefined'){ groupedData[objIndex][element.Age] = 1; } else { groupedData[objIndex][element.Age]++; } }); return groupedData; }
version condensée basée sur l'approche @dante Culaciati avec paramètre de tri en option.
p>
const condenseAge = (arr, isSort = true) => { let r = []; arr.map((val) => { let i = r.findIndex(obj => obj.Date == val.Date); (i < 0) && r.unshift({Date: val.Date}) && (i = 0); (!r[i][val.Age]) ? r[i][val.Age] = 1 : r[i][val.Age]++; }); return !isSort?r:r.sort((a,b)=>(ac=a['Date'].split('/'), bc=b['Date'].split('/'), new Date(ac[2],ac[1],ac[0]) - new Date(bc[2],bc[1],bc[0]))); } console.log(condenseAge([ { Age: "(4-6)", Date: "02/06/20"}, { Age: "(60-100)", Date: "28/05/20" }, { Age: "(60-100)", Date: "28/05/20" }, { Age: "(4-6)", Date: "28/05/20" }, { Age: "(60-100)", Date: "29/05/20" }, { Age: "(38-43)", Date: "29/05/20" }, { Age: "(4-6)", Date: "29/05/20" }, { Age: "(38-43)", Date: "30/05/20" }, { Age: "(38-43)", Date: "30/05/20" } ]));
Kudos à vous c'est une bonne approche, mais je viens d'utiliser Array.Reverse ().
C'est bien, mais il échouera si l'entrée de données n'est pas dans l'ordre chronologique inverse à chaque fois. En supposant que la commande de données d'API n'est pas la meilleure pratique.
Votre solution n'est toujours pas parfaite, si vous allez ajouter des données d'autres mois comme '02 / 06/20 ', alors il affichera "02 / 06/20 "avant '28 / 05/20'.
Changé 'AC [0], AC [1], AC [2]' à 'AC [2], AC [1], AC [0]'.
Bonne prise. Je n'ai pas beaucoup testé la fonction, s'avère que je transmettais les arguments à l'écart de la méthode code> de la date code> de sorte que la journée a été triée. J'ai changé BC [2], BC [1], BC [0] 'à' BC [2], BC [1], BC [0] Code>.
Qu'en est-il des dates passées
29/05/20 code>? Filtrez-les? Votre exemple de sortie indique également
{date: "28/05/20" (38-43) ": 2} code> mais l'entrée n'a qu'un
{âge:" (38-43 ) ", Date:" 29/05/20 "} code> objet. Vous avez également deux entrées pour
28/05/20 code> dans votre sortie, mais une seule entrée pour
29/05/20 code> et ils ne semblent avoir aucune logique de Comment ils sont triés qui est incompatible. Avez-vous commis une erreur ou laissez-vous des choses lorsque vous expliquez la sortie que vous voulez?
Merci d'avoir souligné cela, il a été mis à jour :)
Je vous en prie.