如何将一个可观察到的对象作为映射到ID的值添加到

问题描述

我在Angular中使用RxJS Observables,无法确定使用哪个运算符来发出单个流。我正在使用类型,并且有一个可观察到的发出此信号:

export interface user {
   id: string,name: string,}

发出此信号的人:

export interface devices {
    type: string,os: string,user_id: string,}

并试图将它们组合成一个可观察到的东西,这给了我:

export interface user {
    id: string,devices: Array <{
        type: string,}>
}

将设备根据其user_id映射到用户

解决方法

您需要forkJoin和一个内部管道来扩展用户的设备。

this.usersWithDevices$ = this.myService.getAllUsers().pipe(
  switchMap(users => {
    return forkJoin(users.map(user => {
      return this.myService.getDevicesForUser(user.id).pipe(
        map(devices => ({ ...user,devices })),);
    }));
  }),);

另请参阅我关于stackblitz的示例:https://stackblitz.com/edit/rxjs-98yygy?file=index.ts

,
import { combineLatest,of } from 'rxjs';
import { map } from 'rxjs/operators';

const users$ = of([{id: '1',name: 'John'},{id: '2',name: 'Peter'}]);
const devices$ = of([{type: 'printer',userId: '1'},{type: 'scanner',userId: '2'}]);

const result$ = combineLatest([users$,devices$]).pipe(
    map(([users,devices]) => {
        return users.map(user => {
            const devicesForCurrentUser = devices.filter(device => device.userId === user.id);
            return {
                ...user,devices: devicesForCurrentUser
            };
        });
    })
);

result$.subscribe(res => console.log(res));