Angular RxJS仅从数组中获取更改的对象
是否有任何RxJS函数可以帮助我获得包含已更改对象的数组子集 类似于Angular RxJS仅从数组中获取更改的对象,angular,rxjs,observable,Angular,Rxjs,Observable,是否有任何RxJS函数可以帮助我获得包含已更改对象的数组子集 类似于distinctUntilChanged但我会返回一个包含已更改对象而不是所有对象的数组 我的环境的一个例子是: this.store.select(mySelector) -> observable for a list of objects 我想通过管道将几乎每100ms更新一次的observable返回给我,只返回更新的对象,而不是完整的列表。我一直在考虑最好的解决方案,因为在这种情况下,性能很重要,但我想不出任何
distinctUntilChanged
但我会返回一个包含已更改对象而不是所有对象的数组
我的环境的一个例子是:
this.store.select(mySelector) -> observable for a list of objects
我想通过管道将几乎每100ms更新一次的observable返回给我,只返回更新的对象,而不是完整的列表。我一直在考虑最好的解决方案,因为在这种情况下,性能很重要,但我想不出任何东西,有人有什么建议吗
编辑:我想做一个distinctUntilChanged
,将prev和current数组分配给变量,然后在map
上处理这些变量,但这似乎不是最好的选择,它也不会有好的性能
解决方案:
我通过将@MoxxiManagarm答案与此答案混合得到了一个解决方案,结果如下:
myComparator = (prev: any, curr: any) => {
const returningValue = [];
curr.forEach((obj) => {
const prevObj = prev.find((v) => v.id === obj.id);
if (!prevObj) {
returningValue.push(obj);
} else {
if (JSON.stringify(prevObj) !== JSON.stringify(obj)) {
returningValue.push(obj);
}
}
});
return returningValue;
}
this.obs$ = this.store
.select(mySelector)
.pipe(
startWith([]),
pairwise(),
map(([prev, curr]) => this.myComparator(prev, curr))
);
您可以使用成对和比较两种发射的函数。在我的例子中,我使用了lodash's,但没有
const data = of(
['A'],
['A', 'B'],
['A', 'B'],
['AA', 'B'],
);
data.pipe(
startWith([]),
pairwise(),
map(([l, r]) => without(r, ...l)),
).subscribe(console.log);
输出:
["A"]
["B"]
[]
["AA"]
Stackblitz:没有rxjs操作符可以检测数组或对象中的更改。您需要的是对两个阵列进行操作。你能举一个例子说明你的可观测物体发射什么和应该发射什么。@fridoo它发射一个包含GPS坐标和其他属性的对象列表,但要在与google maps集成时更新它,我只想更新更改过的对象,这就是为什么我想比较以前的数组和当前数组,然后只得到更改过的对象。这是否回答了您的问题@fridoo我正在尝试用一种方法来实现我的数组,如果我成功了,我会稍后告诉你,谢谢。我可以理解它的逻辑,但是如果它不与我的对象一起工作,即使对象在更新之间没有变化,我仍然会收到我的完整数组。好的,你的解决方案给了我一个很好的主意,告诉我如何将它与这里的解决方案结合起来:为了实现我的目标,如果我能找到解决方案,我会让你不断更新。我会将它标记为答案,并用我的解决方案更新我的问题