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!
3 Réponses :
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
n'est pas le résultat demandé par OP
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);
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
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)
le champ de statut est toujours affiché dans votre résultat