1
votes

Comment regrouper les données d'observable par clé imbriquée?

Je construis une nouvelle application et j'ai un problème avec le regroupement des données: / Fondamentalement, ces données proviennent d'observables et j'ai besoin d'objets de groupe par statut et de les pousser dans un tableau. J'ai essayé d'utiliser groupBy () mais cela n'a pas fonctionné.

Voici ce que j'ai:

const result = [
  {
    code: "AVAILABLE",
    displayName: "Available",
    items: [
      {
        id: 3424234,
        name: "asdfgasdgas",
        protocol: 235452345
      },
      {
        id: 543534,
        name: "regertjerg",
        protocol: 7745672345
      }
    ]
  },
  {
    code: "INITIALREVIEW", 
    displayName: "Initial review",
    items: [
      {
        id: 96089678,
        name: "kluioliudas",
        protocol: 7878745
      }
    ]
  }
]

et c'est ce que je veux ...: p >

const data = [
  {
    id: 3424234,
    name: "asdfgasdgas",
    protocol: 235452345,
    status: {
      code: "AVAILABLE",
      displayName: "Available"
    }
  },
  {
    id: 543534,
    name: "regertjerg",
    protocol: 7745672345,
    status: {
      code: "AVAILABLE",
      displayName: "Available"
    }
  },
  {
    id: 96089678,
    name: "kluioliudas",
    protocol: 7878745,
    status: {
      code: "INITIALREVIEW", 
      displayName: "Initial review"
    }
  }
] 

Merci pour votre aide!


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser la méthode reduction () comme indiqué ci-dessous:

result = data.reduce(function (r, a) {
        r[a.status.code] = r[a.status.code] || [];
        r[a.status.code].push(a);
        return r;
    }, Object.create(null));

Ici, nous regroupons par status.code


1 commentaires

n'est pas le résultat demandé par OP



2
votes

essayez ceci:

 

const data = [ { id: 3424234, name: "asdfgasdgas", protocol: 235452345, status: { code: "AVAILABLE", displayName: "Available" } }, { id: 543534, name: "regertjerg", protocol: 7745672345, status: { code: "AVAILABLE", displayName: "Available" } }, { id: 96089678, name: "kluioliudas", protocol: 7878745, status: { code: "INITIALREVIEW", displayName: "Initial review" } } ] 

const groupBy = (arr) => data.reduce((acc, ele)=>( (acc[ele.status.code] = acc[ele.status.code] || []).push(ele), acc),{})

const reformat = ([k, v]) => ({code: k, displayName: v[0].status.displayName, items: v.map(({id, name, protocol})=>({id, name, protocol}))})
  
const result  =  Object.entries(groupBy(data)).map(ele=> reformat(ele))

console.log(result);
 


1 commentaires

Je ne peux pas utiliser reformat car je n'ai pas d'interface const. Donc, votre solution devrait fonctionner dans toutes les données, mais pour le moment, ce n'est pas



0
votes

Cela pourrait être le plus simple et le plus compréhensible.

let arr = [];
let statuses = [];
data.forEach(x => {
    if(!arr.find(code => code == x.status.code)) {
        arr.push(x.status.code);
        statuses.push(x.status);
    }
})
let result = statuses.map((xs:any) => {
    xs.items = data.filter(y => y.status.code == xs.code)
    return xs;
})
console.log(result)


1 commentaires

le champ de statut est toujours affiché dans votre résultat