2016-03-15 142 views
4

我想借此可觀察到的< T [] >並將其轉換爲可觀察到的<Ť>,使得來自每個陣列的可觀測< T [] >被分解和然後通過Observable <T>單獨發射陣列的各個元素。RXJS如何可觀察<T[]>轉換爲可觀察<T>

有沒有這樣做的標準操作符?我搜查了四周,但還沒有找到任何東西。謝謝。


被指向concatMap/flatMap的方向後,我想出了以下的一般解決方法:

var source: Observable<T[]>; 
... 
var splitSource = source.flatMap<T>((x:T[]) => { return Rx.Observable.fromArray(x); }); 
+0

否不存在您描述的隱式功能。你需要自己寫。這應該相當容易 - 只需遍歷數組。 –

+0

當!那麼它不應該很難實現。謝謝。如果您提交的是回覆而不是評論,我會將其標記爲答案 – iam1me

+0

也許某人出現了更好的解決方案 - 可能最終會使用庫中的某些內容。 –

回答

6

您可以使用concatMap這樣的:

function identity (x) {return x} 

var obs_of_array$ = Rx.Observable.return(['1','2','you got it']) 
    .concatMap(identity) 

該作品因爲concatMap也接受數組(和observables和promise)作爲您作爲參數傳遞的函數選擇器的返回值。 Jsbin here,文檔here

因此,作爲參數傳遞的數組成爲選擇器函數的返回值,然後在遵守數組排序的同時被concatMap運算符展平。

+0

這是一個有趣的方法,感謝jsfiddle上的例子。我會在TypeScript中使用它。我更喜歡一些更直接的東西,但我總是可以創建一個包裝這個 – iam1me

+0

在玩它和flatMap多一點後,我發現這適用於我的情況 - 謝謝 – iam1me

0

我也一直在玩轉換Observable<T[]>Observable<T>

我發現flatMap()沒有工作在它自己的,這我相信11個月前,情況並非如此,當有人問。

爲了說明,在@ user3743222的答案的jsfiddle,可以讓這個變化,得到的結果相同:

//.concatMap(identity) 
.flatMap(theArray=>theArray) 

我用這個和toArray()運營商在管道中進行設定操作,例如對可觀察值進行排序。

let sorted$ = source$.toArray().flatMap(theList=> theList.sort(this.myComparer)) 

輸出是Observable<T>。 (N.B在固定陣列的情況下工作,不知道連續生成的源會發生什麼情況)

+0

這應該是一個評論@ user3743222的回答,不是一個新答案 – jediz