使用 Rxjs distinct 运算符比较整个对象与嵌套

Using Rxjs distinct operator to compare whole object with nesting

我有一个 Observable 向我传递一个 json 对象,我在该对象上使用了 distinct 运算符。 如果整个对象与以前相同,我不想重复。我不能只使用像 id 这样的比较器,因为它的 id 可能相同但内容不同。

所以我目前正在对对象进行字符串化,然后使用 distinct,它工作正常

有更好的方法吗?

someObservable
  .startWith(cachedCopy)
  .map(item => JSON.stringify(item))
  .distinct()
  .subscribe(item => {
      //I do some stuff!
     })

其实我觉得用JSON.stringify()比较两个对象是否包含相同的数据是最简单的方法。如果您知道对象身份必须不同,您可以使用 pairwise().filter(pair => pair[0] !== pair[1]) (它们必须是两个不同的对象实例)但这实际上取决于您的用例以及您是否可以保证这种情况(通常不是我个人的经验和比较 JSON 是 "good enough").

请注意,distinct() 自链创建以来仅传递真正不同的项目,但在您的描述中您说 "duplicates if the entire object is same as before" 看起来您应该使用 distinctUntilChanged 代替。

distinctUntilChanged 运算符将一个比较器函数作为可选参数,您可以使用它来检查两个对象是否相同:

.distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))

相反,我使用了 Underscore.js Lib,它有一个名为 unique 的函数真的救了我 https://underscorejs.org/#uniq

1-安装它:

$ npm install underscore

2- 称呼它:

import { _ } from 'underscore';

3-使用它:

this.allcate = _.uniq(this.allcate);

当你的应用程序中有 lodash 时,你可以简单地利用 lodash 的 isEqual() 函数,它会进行深度比较并完美匹配 distinctUntilChanged():

的签名
.distinctUntilChanged(isEqual),

或者如果您有 _ 可用(现在不再推荐):

.distinctUntilChanged(_.isEqual),