2016-10-31 3 views
0

フィルタリングされたobservableをArrayから戻したいのですが、このobservableを購読しているときにフィルタリングされた配列を返さない場合、元の配列が返されます。どうして?Rx jsフィルタメソッドがフィルタ配列を返しません

const filterBy = {title: 'javascript'}; 
const items = [{title: 'javascript'}, {title: 'css'}, {title: 'html'}]; 


const filtered = Rx.Observable.of(items).filter(i => { 
    const filtered = i.filter(item => item.title.indexOf(filterBy.title) !== -1); 
    console.log('filtered', filtered); // The array length is one 
    return filtered; 
}) 

filtered.subscribe(f => console.log(f) // The array length is three); 

答えて

1

これはRxJSでObservablesを使用する方法ではないためです。 RxJS内のフィルタは常に別のObservablesを返し、決して処理された値を直接決して決してしません。

オペレータfilter()は、処理されたオブザーバブルストリームから項目を含めるか除外するかに基づいてブール値trueまたはfalseを返すことを前提としています。 Rx.Observable.of(items)で配列全体を単一の値として渡すので、常にすべてまたは何も渡しません(返された配列はブール値に変換されます)。

Observable.from静的メソッドを使用して、アレイ内の各アイテムを単一の値として放出するObservableを作成し、述語と一致しないすべてのアイテムを除外するfilter()というObservableを作成します。

const filterBy = {title: 'javascript'}; 
const items = [{title: 'javascript'}, {title: 'css'}, {title: 'html'}]; 

const observable = Rx.Observable.from(items).filter(item => { 
    return item.title.indexOf(filterBy.title) !== -1; 
}); 

observable.subscribe(f => console.log(f)); 
+0

が、私はこれを行うことができますどのように配列を返す必要がありますか? –

+0

@ user2999287あなたはオブザーバブルではできません。あなたのユースケースは何か分かりませんが、標準の 'Array.filter()'メソッドや 'Array.map()'だけを使うことができると思います。 – martin

0

あなたはのtoArrayのopereatorを持つ配列を返すことができます。

const filterBy = {title: 'javascript'}; 
const items = [{title: 'javascript'}, {title: 'css'}, {title: 'html'}]; 

const observable = Rx.Observable.from(items).filter(item => { 
    return item.title.indexOf(filterBy.title) !== -1; 
}).toArray(); 
+0

ニース。ありがとう! –

関連する問題