使用 Rxjs 不同运算符将整个对象与嵌套进行比较

Man*_*han 4 json object rxjs rxjs5 angular

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

所以我目前正在对对象进行字符串化,然后使用不同的,它工作得很好

有一个更好的方法吗?

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

mar*_*tin 5

实际上我认为使用JSON.stringify()比较两个对象是否包含相同的数据是最简单的方法。如果您知道对象标识必须不同,您可以使用pairwise().filter(pair => pair[0] !== pair[1])(这些必须是两个不同的对象实例),但这实际上取决于您的用例,并且您是否可以保证这样的条件(通常不是我个人的经验,并且比较 JSON 是“好的”)足够的”)。

请注意,distinct()自创建链以来,仅传递真正不同的项目,但在您的描述中,您说“如果整个对象与以前相同,则重复”,这似乎您应该使用distinctUntilChanged

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

.distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))
Run Code Online (Sandbox Code Playgroud)

  • Stringify 不是一个好的选择,事实上它是一个错误的选择,因为它的键顺序不稳定。 (2认同)