Angular RxJS仅从数组中获取更改的对象

Angular RxJS仅从数组中获取更改的对象,angular,rxjs,observable,Angular,Rxjs,Observable,是否有任何RxJS函数可以帮助我获得包含已更改对象的数组子集 类似于distinctUntilChanged但我会返回一个包含已更改对象而不是所有对象的数组 我的环境的一个例子是: this.store.select(mySelector) -> observable for a list of objects 我想通过管道将几乎每100ms更新一次的observable返回给我,只返回更新的对象,而不是完整的列表。我一直在考虑最好的解决方案,因为在这种情况下,性能很重要,但我想不出任何

是否有任何RxJS函数可以帮助我获得包含已更改对象的数组子集

类似于
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我正在尝试用一种方法来实现我的数组,如果我成功了,我会稍后告诉你,谢谢。我可以理解它的逻辑,但是如果它不与我的对象一起工作,即使对象在更新之间没有变化,我仍然会收到我的完整数组。好的,你的解决方案给了我一个很好的主意,告诉我如何将它与这里的解决方案结合起来:为了实现我的目标,如果我能找到解决方案,我会让你不断更新。我会将它标记为答案,并用我的解决方案更新我的问题