2017-03-27 48 views
1

您以前見過這個問題,但我想了解RxJs中這個問題的流程。在RxJs中分解兩個陣列

array1 = ["cat", "dog", "taco"] 
array2 = ["cat", "dog", "fish"] 

過濾數組2只顯示項目沒有陣列1。預期結果:

result = ["fish"] 

什麼工作:array1.map(value1 => array2 = array2.filter(value2 => value1 !== value2));

也許有更好的辦法?

+0

你說的是陣列或rxjs?在Rxjs中,基於另一個流過濾流的概念聽起來很糟糕。如果他們只是數組,我會做'array2.filter(value2 =>!array1.includes(value2))' – olivarra1

+0

'includes()'很棒,但我們的項目必須使用IE 9和10.當然,有[這個大,醜陋的polyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill)可用。我正在處理Observables,而不是數組,但是我想找到一種關係,因爲RxJs給了我們一些相同的(以及更多)功能。感謝您的建議! – wolfhoundjesse

+1

否則你有hack'array1.indexOf(value2)> = 0',但是這在某些邊緣情況下不起作用,例如處理對象我認爲 – olivarra1

回答

1

你不需要rxjs來做差異。您可以使用任何提供差異功能的庫。例如,如果您使用ramda,那麼difference運算符會執行此操作。參看http://ramdajs.com/docs/#difference

我相信underscore也存在同樣的方法。

如果你想用Rxjs做到這一點,你不能逃避O(nm)算法。對於給定的庫,你可能會更幸運一些特定的算法(例如,如果你有大數組來比較)。

+0

「但我想了解RxJs中這個問題的流程。 – wolfhoundjesse

+0

沒錯,但是這個問題在Rxjs中的流動是沒有意義的。你不會在rxjs中比較數組,你會差數組。在rxjs中,你處理流。所以如果你把你的問題變成一個關於流的問題,你將有更多機會得到你可以使用的答案。 – user3743222

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>

你也可以去這裏其他的解決方案: Diffing two Observables

+0

雖然這可能在理論上回答這個問題,但[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包含答案的基本部分,並提供供參考的鏈接。 – hmijail

+0

我已經添加了一些示例代碼 – Asgraf