-1
votes

Comment grouper des objets d'objets avec les mêmes clés utilisant JavaScripts?

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


3 commentaires

Qu'en est-il des dates passées 29/05/20 ? Filtrez-les? Votre exemple de sortie indique également {date: "28/05/20" (38-43) ": 2} mais l'entrée n'a qu'un {âge:" (38-43 ) ", Date:" 29/05/20 "} objet. Vous avez également deux entrées pour 28/05/20 dans votre sortie, mais une seule entrée pour 29/05/20 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.


4 Réponses :


0
votes

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


0 commentaires

2
votes

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)


0 commentaires

1
votes

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


0 commentaires

0
votes

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


5 commentaires

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 de la date 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] .