如何在RxJs中获取行为主体中更改的对象?
我在听一个可观察的声音,在第一次发射所有物体后,我只想得到改变了的物体。因此,如果我有:如何在RxJs中获取行为主体中更改的对象?,rxjs,observable,Rxjs,Observable,我在听一个可观察的声音,在第一次发射所有物体后,我只想得到改变了的物体。因此,如果我有: [{name:'Mark'},{name:'Joe'}] 然后更改名称,我只得到更改的对象。因此,如果对象变为: [{name:'Jean-Mark'},{name:'Joe'}] 我只有 [{name:'Jean-Mark'}]您可以使用javascript代理查看数组(索引值/添加/删除),但这不会查看数组中的对象更改 const handler = { set: function(target, pr
[{name:'Mark'},{name:'Joe'}]
然后更改名称,我只得到更改的对象。因此,如果对象变为:
[{name:'Jean-Mark'},{name:'Joe'}]
我只有
[{name:'Jean-Mark'}]
您可以使用javascript代理查看数组(索引值/添加/删除),但这不会查看数组中的对象更改
const handler = {
set: function(target, property, value, receiver){
console.log('setting ' + property + ' for ' + target + ' with value ' + value);
target[property] = value;
return true;
}
}
const arr=[{name: 'Mark'},{name: 'Joe'}];
const proxy = new Proxy(arr, handler);
// will log
proxy[0]="hello"
// won't log
proxy[0].name="ben"
如果您还希望监视对象的更改,那么您需要为添加的每个对象使用代理,或者创建要添加的对象
并添加您的setter
还有一个现有的库可以监视对象和数组的变化,它还使用proxy
您的可观测阵列发射阵列,您想知道当前发射阵列与前一个阵列之间的差异。跟踪阵列状态变化更多地涉及如何比较阵列或对象,而不是观察值 如果你想在一个可观察的范围内跟踪变化,实际上可以归结为比较前一个值和当前值。您想在这里使用的逻辑取决于您。e、 g.您必须考虑如何区分数组中的“修改”值和新“添加”值 查看以下问题以开始学习:
成对
将当前值cv
与前一个值pv
进行比较。下面是一个例子,它可能是什么样子的
const source=of(
[{姓名:“马克”,p:2},{姓名:“乔”,p:3}],
[{姓名:“Jean-Mark”,p:2},{姓名:“Joe”,p:3}],
[{name:“Jean-Mark”,p:1},{name:“Joe”,p:3},{name:“Alice'}],
[{姓名:“Jean-Mark”,p:1},{姓名:“Joe”,p:3}],
[{姓名:“Jean-Mark”,p:1},{姓名:“Joe”,p:4}],
[{姓名:“Jean-Mark”,p:1},{姓名:“Joe”,p:4}]
);
//比较两个物体
常量objectsEqual=(o1,o2)=>
类型o1==“对象”&&object.keys(o1).length>0
? Object.keys(o1).length==Object.keys(o2).length&&
Object.keys(o1).every(p=>objectsEqual(o1[p],o2[p]))
:o1==o2;
//比较两个数组
//用您自己的逻辑替换此函数,以获得所需的输出!!!
常量差=(上一个,当前)=>({
添加:当前筛选器(o1=>!prev.some(o2=>objectsEqual(o1,o2)),
移除:上一个过滤器(o1=>!curr.some(o2=>objectsEqual(o1,o2)))
})
源管道(
startWith([]),//用于两两立即发出第一个值
成对(),//发出上一个值和当前值
映射(([pv,cv])=>差异(pv,cv))//映射到pv和cv之间的差异
).subscribe(console.log);
我认为这与可观察对象无关,而是与Javascript数组有关。我认为是这样的。我想使用类似distinctChange()的东西,但只得到更改的对象,而不是整个观察对象。你需要自己制作一系列操作符来完成这项工作,因为BehaviorSubject不提供这种现成的东西。任何这样做的东西都不必是BehaviorSubject复杂的部分是对象比较。您是否只需要通过
name
property比较对象?是否可以更改哪个对象?您需要一种方法来判断两个不同的对象是否实际代表同一个对象,例如,使用id。我已经在每个对象上有了id,但是我如何在您上面解释的内容中表示它?实际上,这显示了一个条目和另一个条目之间的差异。我想要的是一个完整列表和另一个列表之间的差异。如果列表已更改,我想知道在整个列表中添加、删除或修改了哪些内容。它显示了列表之间的差异pv
和cv
是列表,difference
应该计算这些列表之间的差异。为了得到满足您确切需求的函数差异的实现,我认为最好问另一个问题(首先搜索解决方案),因为这与可观测值无关。