Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在RxJs中获取行为主体中更改的对象?_Rxjs_Observable - Fatal编程技术网

如何在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
应该计算这些列表之间的差异。为了得到满足您确切需求的函数
差异
的实现,我认为最好问另一个问题(首先搜索解决方案),因为这与可观测值无关。