假设我有两个观测值。
第一个可观察到的是某些列表的数组:
[
{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数组。