2017-10-03 5 views
1

RXJS J'ai une collection comme ceci:Groupe une liste d'objets à plat dans une liste imbriquée par propriété d'objet spécifique à l'aide

FlatObject 
[ 
    { 
    id:"1", 
    name:"test1", 
    group: "A" 
    }, 
    { 
    id:"2", 
    name:"test2", 
    group: "B" 
    }, 
{ 
    id:"3", 
    name:"test3", 
    group: "B" 
    }, 
    { 
    id:"4", 
    name:"test4", 
    group: "A" 
    }, 
] 

Et je veux obtenir l'aide Observable avec RxJs un dictionnaire regroupés par groupe quelque chose comme ceci:

NestedObjects 

[{ 
    "group": "A", 
    "objectProps": [{ 
     "id": "1" 
     "name": "test1", 

    }, 
    { 
     "id": "4" 
     "name": "test4", 

    }] 
}, 
{ 
    "group": "B", 
    "objectProps": [{ 
     "id": "2" 
     "name": "test2", 

    }, 
    { 
     "id": "3" 
     "name": "test4", 

    }] 
}] 

Quand j'étais essayer l'opérateur que je pense est plus proche est le réduire ou tout simplement utiliser le faire et je pensais faire quelque chose comme ce code où j'avoir des effets secondaires sur un objet de collection.

let collectionNestedOBjects: NestedObjects[]; 
..... 
.map((response: Response) => <FlaTObject[]>response.json().results) 
.reduce(rgd, rwgr => { 

       // Soudo Code 

       // Create NestedObject with group 

       // Check if collectionNestedOBjects has an object with that group name 
         Yes: Create a objectProps and add it to the objectProps collection 
         No: Create a new NestedObject in collectionNestedObjects and Create a objectProps and add it to the objectProps collection 

      } 
      ,new ReadersGroupDetail()); 

Y at-il un autre opérateur qui font cette projection claire et aucun ayant des effets secondaires?

Répondre

0

Vous pouvez utiliser .map() opérateur et la carte du type que vous voulez:

const data: Observable<NestedObject[]> = getInitialObservable() 
    .map((response: Response) => <FlatObject[]>response.json().results) 
    .map((objects: FlatObject[]) => { 
    // example implementation, consider using hashes for faster lookup instead 
    const result: NestedObjects[] = []; 

    for (const obj of objects) { 
     // get all attributes except "group" into "props" variable 
     const { group, ...props } = obj; 
     let nestedObject = result.find(o => o.group === group); 
     if (!nestedObject) { 
     nestedObject = { group, objectProps: [] }; 
     result.push(nestedObject); 
     } 
     nestedObject.objectProps.push(props); 
    } 
    return result; 
    }); 
+0

Oui ce travail, il lui manquait le résultat de retour, j'ajouté et a été testée et regroupe les données bien – Devsined