假设我有两个观测值。

第一个可观察到的是某些列表的数组:

[
    {id: 'zzz', other props here...},
    {id: 'aaa', ...},
    {id: '007', ...}
    ... and more over time
]


第二个可观察的是一组忽略的清单:

[
    {id: '007'}, // only id, no other props
    {id: 'zzz'}
    ... and more over time
]


结果应该是一个新的可观察列表(第一个可观察),但不得包含任何被忽略的列表:

[
    {id: 'aaa', other props here...}
    ... and more over time
]


这是我现在发布之前的内容:

obs2.pipe(withLatestFrom(obs1, ? => ?, filter(?));

最佳答案

我没有对其进行测试,但是我认为应该没问题:

combineLatest(values$, excluded$).pipe(
  map(([values, excluded]) => {
    // put all the excluded IDs into a map for better perfs
    const excludedIds: Map<string, undefined> = excluded.reduce(
      (acc: Map<string, undefined>, item) => {
        acc.set(item.id, undefined)
        return acc;
      },
      new Map()
    );

    // filter the array, by looking up if the current
    // item.id is in the excluded list or not
    return values.filter(item => !excludedIds.has(item.id))
  })
)


说明:

使用combineLatest始终会警告您,无论您从何处获取更新。如果在示例中使用withLatestFrom,则只有在values$ observable被更新时,它才会触发更新。但是,如果excluded$更改,则不会触发您的情况的更新。

然后将所有排除的ID放入映射而不是数组中,因为我们需要知道是否应该排除给定的ID。调查地图要比调查数组快。

然后只需过滤values数组。

09-18 16:10