2017-04-11 7 views
2

現在、RxJSでMap Observableをフィルタリングすることで苦労しています。 私がしようとするのは、それを購読する前にフィルタ関数でマップオブジェクトを減らすことです。RxJSマップOberservableをフィルタリングする方法

私はこのような件名をINIT:

public myObjects: ReplaySubject<Map<number, MyClass>> = new ReplaySubject<Map<number, MyClass>>(1); 

そして、それは私がフィルタリングしようとする方法は次のとおりです。

public subscribeToIncomingObjects() { 
this.myObjects.map((currentValue:Map<number, MyObject>) => Array.from(currentValue.values())).filter(
    (con:myObject, index) => { 
    return someCondition; 
    } 
); 
} 

詐欺はArray型ではなく、単一のインスタンスであるいくつかの理由。私は本当に助言に感謝します。

+1

前の '.map()'呼び出しから 'Array.from(...)'を持つ配列を返しています。そのため、次の 'filter()'は元のオブジェクトではなくArrayを取得します。 – martin

+0

こんにちは@マーティン、説明のおかげで。何らかの理由で、ここで説明したように、フィルタ関数内で配列の単一の値を取得することを期待していました:http://reactivex.io/documentation/operators/filter.html。 Rx.Observable.range(X、Y)は実際にArray Observableを生成しませんか? –

+1

いいえ、これは 'Observable 'インスタンスを作成し、その範囲内のすべての数字を別個のアイテムとして発行します。 – martin

答えて

0

まず第一に、物事、

あなたはObservableを扱っている:

this.myObjects.map((currentValue:Map<number, MyObject>) => Array.from(currentValue.values())) 

Observable<MyObject[]>を返します。したがって、.filter()Observableと呼ぶと、Observableのブロードキャストをフィルタリングしています。

あなたはこのようなあなたのフィルタを呼び出すことができます:あなたはまだあなたが単一のインスタンスが必要な場合、それが利用可能な場合、あなたがより良いArray.prototype.find()を使用したい、配列になるだろう

public subscribeToIncomingObjects() { 
    this.myObjects.map((currentValue: Map < number, MyObject >) => { 
    return Array.from(currentValue.values()) 
     .filter((con: myObject, index) => someCondition); 
    }); 
} 

しかし:

public subscribeToIncomingObjects() { 
    this.myObjects.map((currentValue: Map < number, MyObject >) => { 
    return Array.from(currentValue.values()) 
     .find((con: myObject, index) => someCondition); 
    }); 
} 

か、まだArray.prototype.filter()を使用して:

public subscribeToIncomingObjects() { 
    this.myObjects.map((currentValue: Map < number, MyObject >) => { 
    return Array.from(currentValue.values()) 
     .filter((con: myObject, index) => someCondition)[0]; 
    }); 
} 
関連する問題