Angular 的 Operators 中有一个 distinctUntilChanged 操作符,它可以过滤掉连续发送相同元素的 Observable。默认情况下,它使用的是对象引用比较,即只有当两个发射出来的元素的引用不同,才会被认为是不同的。但有时我们需要使用值比较,即只要两个元素的属性值相同,就认为它们相同,如下例:
const obj1 = { id: 1 };
const obj2 = { id: 1 };
of(obj1, obj2, obj2, obj1)
.pipe(distinctUntilChanged())
.subscribe(console.log);
// Output:
// { id: 1 }
// { id: 1 }
// { id: 1 }
// { id: 1 }
of(obj1, obj2, obj2, obj1)
.pipe(distinctUntilChanged((prev, curr) => prev.id === curr.id))
.subscribe(console.log);
// Output:
// { id: 1 }
可以看到,第一个例子中,obj1 和 obj2 被认为是两个不同的元素,因为它们的引用不同,而第二个例子中,只有一个元素被输出,因为 obj1 和 obj2 的 id 属性都是相同的。