2015-12-17 5 views
12

私はフィルタリングしたい配列を持っています。 しかし、私が行うとき、私はまだ全体の配列を取得...RXJS ArrayObservableをフィルタリングする方法

にconsole.logでとても
constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.map(s => { 
     let news = JSON.parse(s._body); 
     return Rx.Observable.fromArray(news); 
    }).filter(function(data) { 
     console.log('all array ' + data); 
     return true; 
    }).subscribe(function (v) { 
     console.log(v); 
    }); 
} 

(「すべての配列」+データ);個々の配列メンバのストリームの代わりに、配列全体を取得しています。なぜですか?ここ

がデバッグスナップです:

enter image description here

私は予想通り、これが動作するため、私は狂っていないです知っている:

Rx.Observable.fromArray([1, 2, 3, 4, 5]).filter(function (v) { 
     if (v < 3) 
      return true 
     return false; 
    }).subscribe(function (v) { 
     console.log(v); 
    }) 

与えるもの?

読み取り用tx、

Sean。

答えて

13

concatMap/flatMapなどのオブザーバブルシーケンスをフラット化する演算子を使用する必要があります。

今のところ、.filterは配列の個々の要素ではなく、観測可能なものを受け取ります(配列を観測可能にするだけです).2番目の例は、その観測対象に直接フィルタを適用する)。

この試してみてください:あなたがそうでなければ(#mapを使用して)と同じようにあなたは、これを実行する必要が

constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.flatMap(s => { 
    let news = JSON.parse(s._body); 
    return Rx.Observable.fromArray(news); 
    }).filter(function(data) { 
    console.log('all array ' + data); 
    return true; 
    }).subscribe(function (v) { 
    console.log(v); 
    }); 
} 

は、観測の観測可能を持っている(あなたが観察できるの内側に観察を返す)が、実際に仕事をしたいですニュース内に含まれる値(それらを含む観測値ではない)。これは、配列を連結して要素として追加するだけの違いと似ています。

あなたが前に行ったように、この使用されるだろうマップをやってますが発せられた観測をマージするもう一つの有効な方法

constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.map(s => { 
    let news = JSON.parse(s._body); 
    return Rx.Observable.fromArray(news); 
    }).mergeAll() // here you flatten the observable - i.e. you emit just the values contained in incoming observables and lose the observables themselves 
    .filter(function(data) { 
    console.log('all array ' + data); 
    return true; 
    }).subscribe(function (v) { 
    console.log(v); 
    }); 
} 

(flatMap/concatMapはただ一度で&マージをマッピング)あなたは、のいずれかを理解していなかった場合これは心配しないで、people私よりもそれを説明することができます:)

+0

最初にすべてのありがとう...トリックをしたが、私に聞かせて、なぜ私はフラットマップを使用する必要があります、私は戻ってくる1つの観測可能なRx.Observable.fromArray(ニュース)はまったくではないので、なぜ単一の観測対象をフレーミング(結合)する必要がありますか? TX !!!!!!!!!!! – born2net

+0

あなたの質問に答えるために編集されました。 –

関連する問題