【问题标题】:How to map two Oberservable arrays based on a value?如何根据一个值映射两个 Observable 数组?
【发布时间】:2021-07-04 19:41:44
【问题描述】:

我有两个可观察的数组。

habits$: Observable<Habit[]>;
status$: Observable<Status[]>;

习惯的结构如下:

export interface Habit {
  habitId: number;
  name: string;
  repeatVal: number;
  notification: string;
  color: string;
  question: string;
  id: number;
}

status 数组有 habitId、date 和 status 作为键。

我想根据两者中存在的habitId 属性将habits$ 和status$ 合并到一个Observable 数组中。

我已经做了一些研究,mergeMap() 和 forkJoin() 的组合似乎是要走的路,如下所示 Combine multiple observable arrays into new object array

但我想不出适合我的语法。

这就是我的代码目前的样子:

ngOnInit() {
this.habits$ = this.habitService.fetchAllById(this.authService.userId);
console.log(this.habits$);
this.status$ = this.statusService.fetchAll();
this.habits$.pipe(
  mergeMap(habits => {
  this.status$ = this.statusService.fetchAll().filter(status => status.habitId == habits.habitId);
}));
console.log(this.joined$);}

【问题讨论】:

  • 您想要的合并数组的类型是什么?
  • 你需要在你的mergemap中返回一个observable(我想我会使用switchmap),现在你只是在分配一些东西:只要返回this.statusService.fetchAll().filter(status => status .habitId == 习惯.habitId);
  • 另一个 Observable 数组。基本上我想将两个 Observable 数组合并为一个,其中来自 status-Observable 的值根据匹配的 habitId 附加到 habit-Observable 的值。

标签: arrays angular typescript rxjs observable


【解决方案1】:

我会以下列方式使用 forkJoin:

ngOnInit() {
  forkJoin([
    this.habitService.fetchAllById(this.authService.userId),
    this.status$ = this.statusService.fetchAll()
  ]).subscribe(([habits, statuses]) => {
    this.joined = habits.map(habit => ({
      ...statuses.find(t => t.habitId === habit.habitId),
      ...habit 
    }));
  });
}

看简单的demo

【讨论】:

  • 首先非常感谢 Moshezauros 的回答。不幸的是,我在编译时遇到错误:错误:src/app/data-table/data-table.component.ts:68:7 - error TS2740: Type '{ length: number; toString(): 字符串; toLocaleString(): 字符串; pop():习惯; push(...items: Habit[]): number; concat(...items: ConcatArray[]): Habit[]; concat(...items: (Habit | ConcatArray<...>)[]): Habit[]; ... 28 更多 ...;状态:号码; }[]' 缺少类型 'Observable' 的以下属性:_isScalar、source、operator、lift 和另外 5 个。
  • 这可能是因为返回的是订阅而不是可观察的数组吗?
  • 我怎样才能让它返回一个 Observable 数组而不是一个订阅?
  • 如果您希望我帮助您调试,您需要指定更多代码(最好使用 stackblitz)。 this.joined$ 应该是一个 BehaviorSubject(而不是一个 observable)然后你写 this.joined$.next(insert_the_new_array_here)
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2021-12-07
  • 1970-01-01
  • 2021-08-23
  • 2020-06-22
相关资源
最近更新 更多