您之前已经看过这个问题,但我想了解这个问题在RxJs中的流程。
array1 = ["cat", "dog", "taco"]
array2 = ["cat", "dog", "fish"]
过滤 array2 以仅显示不在 array1 中的项目。预期结果:
result = ["fish"]
有效: array1.map(value1 => array2 = array2.filter(value2 => value1 !== value2));
也许有更好的方法?
答案 0 :(得分:1)
你不需要rxjs来进行差异化。您可以使用任何提供diffing功能的库。例如,如果您使用ramda
,则difference
运算符会执行此操作。参看http://ramdajs.com/docs/#difference。
我相信同样的方法也适用于underscore
。
如果您使用Rxjs执行此操作,则无法转义O(nm)算法。对于给定的库,您可能会更幸运地使用特定算法(例如,如果您有大数组要进行差异)。
答案 1 :(得分:0)
你的意思是区分两个可观察者吗? 这是我的解决方案:
<html>
<head>
<title></title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.3.0/Rx.js"></script>
<script>
const observable_a = Rx.Observable.interval(2000).take(10);//0,1,2,3,4,5,6,7,8,9
const observable_b = Rx.Observable.interval(1000).map(x=>x+3).take(5);//3,4,5,6,7
function observableDiff(a,b,filter) {
if(!filter) {
filter = (value_to_check,blacklist_array)=>{
return blacklist_array.indexOf(value_to_check)===-1;
};
}
return Rx.Observable.create(observer=>{
let a_values = [];
let b_values = [];
let a_completed = false;
let b_completed = false;
a.forEach(a_value=>{
if(b_completed) {
if(filter(a_value,b_values)) {
observer.next(a_value);
}
} else {
a_values.push(a_value);
}
}).then(()=>{
a_completed = true;
if(b_completed) {
observer.complete();
}
});
b.forEach(b_value=>{
b_values.push(b_value);
}).then(()=>{
b_completed = true;
a_values.forEach(a_value=>{
if(filter(a_value,b_values)) {
observer.next(a_value);
}
});
a_values = [];
if(a_completed) {
observer.complete();
}
});
});
}
observableDiff(observable_a,observable_b).subscribe(console.log);//0,1,2,8,9
</script>
</head>
<body></body>
</html>
&#13;
您也可以到这里寻求其他解决方案: Diffing two Observables