在RxJ中区分两个数组

时间:2017-03-27 17:31:32

标签: javascript arrays rxjs

您之前已经看过这个问题,但我想了解这个问题在RxJs中的流程。

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

过滤 array2 以仅显示不在 array1 中的项目。预期结果:

result = ["fish"]

有效: array1.map(value1 => array2 = array2.filter(value2 => value1 !== value2));

也许有更好的方法?

2 个答案:

答案 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;
&#13;
&#13;

您也可以到这里寻求其他解决方案: Diffing two Observables