您以前見過這個問題,但我想了解RxJs中這個問題的流程。在RxJs中分解兩個陣列
array1 = ["cat", "dog", "taco"]
array2 = ["cat", "dog", "fish"]
過濾數組2只顯示項目沒有陣列1。預期結果:
result = ["fish"]
什麼工作:array1.map(value1 => array2 = array2.filter(value2 => value1 !== value2));
也許有更好的辦法?
您以前見過這個問題,但我想了解RxJs中這個問題的流程。在RxJs中分解兩個陣列
array1 = ["cat", "dog", "taco"]
array2 = ["cat", "dog", "fish"]
過濾數組2只顯示項目沒有陣列1。預期結果:
result = ["fish"]
什麼工作:array1.map(value1 => array2 = array2.filter(value2 => value1 !== value2));
也許有更好的辦法?
你不需要rxjs來做差異。您可以使用任何提供差異功能的庫。例如,如果您使用ramda
,那麼difference
運算符會執行此操作。參看http://ramdajs.com/docs/#difference。
我相信underscore
也存在同樣的方法。
如果你想用Rxjs做到這一點,你不能逃避O(nm)算法。對於給定的庫,你可能會更幸運一些特定的算法(例如,如果你有大數組來比較)。
「但我想了解RxJs中這個問題的流程。 – wolfhoundjesse
沒錯,但是這個問題在Rxjs中的流動是沒有意義的。你不會在rxjs中比較數組,你會差數組。在rxjs中,你處理流。所以如果你把你的問題變成一個關於流的問題,你將有更多機會得到你可以使用的答案。 – user3743222
您的意思是區分兩個可觀察對象嗎? 這裏是我的解決方案:
<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>
你也可以去這裏其他的解決方案: Diffing two Observables
你說的是陣列或rxjs?在Rxjs中,基於另一個流過濾流的概念聽起來很糟糕。如果他們只是數組,我會做'array2.filter(value2 =>!array1.includes(value2))' – olivarra1
'includes()'很棒,但我們的項目必須使用IE 9和10.當然,有[這個大,醜陋的polyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill)可用。我正在處理Observables,而不是數組,但是我想找到一種關係,因爲RxJs給了我們一些相同的(以及更多)功能。感謝您的建議! – wolfhoundjesse
否則你有hack'array1.indexOf(value2)> = 0',但是這在某些邊緣情況下不起作用,例如處理對象我認爲 – olivarra1