Búsqueda de sitios web

angular - Cómo usar la clave de agrupamiento en GroupBy en RxJS,


Tengo una estructura devuelta por la API

Esto es una firma

methodApi(): Observable(Array<MyClass>)

Esto es datos

{ id: 1, name: 'Red', parentId: null }
{ id: 2, name: 'Apple', parentId: 1 }
others

Quiero agruparlo por parentId

methodApi()
.pipe(groupby((x: MyClass[] => ...))) // THERE
.subscribe(x => console.log(x));

MethodApi retorna Observable<Array>, en el método 'groupby' como parámetro de entrada tengo un array, por lo que no puedo referirme a la propiedad parentId. Cuando cambio el parámetro de entrada a MyClass entonces obtengo un error de compilación.

¿Cómo resolver este agrupamiento? Uso Angular 9.0 con RxJS 6.5.5

Respuesta #1

Tendrás que crear otro flujo observable a partir de tu arreglo usando from, y luego usar groupBy y después convertirlo de nuevo a un arreglo de resultados:

methodApi().pipe(
  concatMap((result) => from(result)),
  groupBy((item) => item.parentId),
  mergeMap(group => group.pipe(toArray()))
).subscribe(x => console.log(x));

pila de ejemplo

También puedes usar mergeAll:

methodApi().pipe(
  mergeAll(),
  groupBy((item) => item.parentId),
  mergeMap(group => group.pipe(toArray()))
).subscribe(x => console.log(x));

pila de ejemplo

Respuesta #2

Debería ser simple usando el operador groupBy como se muestra a continuación,

methodApi().pipe(
  groupBy((item) => item.parentId),
  mergeMap(group => group.pipe(toArray()))
).subscribe(console.log) // should get you an array with groupBy parentId

Artículos relacionados