首页 > 解决方案 > 加入两个可观察对象并删除重复项

问题描述

我在 Angular 9 中调用了两种服务方法,如下所示:

var u1 = this.userService.getByDepartmentId(departmentId).pipe(
  map((payload: Payload<GetByDepartmentIdModel[]>) => 
    payload.result.map((user: GetByDepartmentIdModel) => { 
      return {
        id: user.id, 
        forename: user.forename, 
        surname: user.surname 
      };
    })));

var u2 = this.userService.getByStoreId(storeId).pipe(
  map((payload: Payload<GetByStoreIdModel[]>) => 
    payload.result.map((user: GetByStoreIdModel) => { 
      return {
        id: user.id, 
        forename: user.forename, 
        surname: user.surname 
      };
    })));

方法getByDepartmentIdgetByStoreId返回一个Observable<Payload<GetByDepartmentIdModel[]>Observable<Payload<GetByStoreIdModel[]>>

如何加入这两个响应,u1u2删除重复项(比较 user.id)?

标签: angulartypescriptrxjsangular9

解决方案


好吧,你首先使用forkJoin组合 observables,然后你用 做一个基本的数组方法concatfilter将它映射到你想要的对象,你就完成了:

forkJoin([
  this.userService.getByDepartmentId(departmentId),
  this.userService.getByStoreId(storeId)
]).pipe(
  map(([ depPayload, storePayload ]) => depPayload.result.concat(storePayload.result)
    .filter(({ id }, i, arr) => arr.findIndex((subj) => subj.id === id) === i)
    .map(({ id, forename, surname }) => ({ id, forename, surname })
);

推荐阅读