0
votes

Groupe par tableau d'objets par une clé imbriquée

J'ai les données suivantes: xxx pré>

Je veux le regrouper en fonction du parent.id code> et calculez le score moyen, afin que je puisse avoir ce qui suit. Résultat: P>

let group = cars.reduce((r, a) => {
   console.log("a", a);
   console.log('r', r);
   r[a.make] = [...r[a.parent.id] || [], a];
   return r;
}, {});
console.log("group", group);


4 commentaires

Qu'est-ce que a.make ? Il n'y a pas de propriété dans vos objets.


Il devrait être a.parent.id .


Le tableau résultant ne devrait-il pas avoir les scores à l'intérieur de chaque article et non comme un attribut du parent?


@GandPhuba Yea, en fait, c'est mieux, je vais mettre à jour la question. MERCI


3 Réponses :


0
votes

Créer un objet / HASHMAP, puis formater l'objet résultant dans un tableau. xxx

sortie: xxx


1 commentaires

Remarque, j'ai mis le score à l'intérieur de chaque article comme mentionné dans les commentaires de votre question.



0
votes

À partir des données que vous avez fournies Si vous avez besoin de compter la moyenne de la propriété CODE> SCORE CODE>, utilisez la méthode suivante: elle ira déterrera vos données, regroupez-la et calculez la valeur totale du score et comptez des valeurs de score. Et après réduction des groupes Objet effectuer une carte qui calculera la moyenne pour le score pour tous les groupes à l'aide de tous les groupes à l'aide de totauxcore code> et scorecount code>

p>

const data = [
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "Italy"
        },
        score: 5
    },
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "France"
        },
        score: 4.5
    },
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "UK"
        },
        score: 4.9
    },
    {
        parent: {
            id: "2",
            name: "Afrique"
        },
        item: {
            name: "Morocco"
        },
        score: 3.1
    },
    {
        parent: {
            id: "2",
            name: "Afrique"
        },
        item: {
            name: "Egypt"
        },
        score: 3.9
    }
];

let group = data.reduce((acc, rec) => {
   if (acc.find(item => item.parent.id === rec.parent.id))
     {
       const idx = acc.findIndex(item => item.parent.id === rec.parent.id)
       acc[idx].parent.items = acc[idx].parent.items.concat(rec.item)
       acc[idx].parent.score += rec.score
       acc[idx].parent.scoreCount +=1
       
     } else {
       acc = acc.concat({parent: {...rec.parent, score: rec.score, items: [rec.item], scoreCount:1}})
       
     }
   
   return acc
}, []).map(it => ({parent: {id: it.parent.id, name:it.parent.name, score: (it.parent.score / it.parent.scoreCount), items: it.parent.items}}));

console.log("group", group);


0 commentaires

1
votes

Vous pouvez utiliser _reduce () code> fonction: https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_Objects/array/reduce xxx pré>

P>

const data = [
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "Italy"
        },
        score: 5
    },
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "France"
        },
        score: 4.5
    },
    {
        parent: {
            id: "1",
            name: "Europe"
        },
        item: {
            name: "UK"
        },
        score: 4.9
    },
    {
        parent: {
            id: "2",
            name: "Afrique"
        },
        item: {
            name: "Morocco"
        },
        score: 3.1
    },
    {
        parent: {
            id: "2",
            name: "Afrique"
        },
        item: {
            name: "Egypt"
        },
        score: 3.9
    }
];

var result = data.reduce((res, data) => {
  if(!res[data.parent.id]) {
    data.item = [data.item];
    res[data.parent.id] = data;
  } else {
res[data.parent.id]['item'].push(data['item']);
res[data.parent.id]['score'] = (res[data.parent.id]['score'] + data['score'])/2;
  }
  return res;
}, [])
.filter(x => x != null)

console.log(result)


0 commentaires