1
ストアから取得した値をフラット化し、ストアが発生したときにそれらを単一の配列として出力したいとします。完全ではないRxJSストリーム内のネストされたデータ構造を平滑化
同期バージョンでは、私のNo-RxJSの例はかなり簡単ですが、RxJSでどうやって行うのか分かりません。
RxJSを使用して、.next
コールの値をバッファリングできると仮定します。
これにRxJS演算子を使用する必要がありますか?はいの場合、ネストされたデータ構造をフラットにするにはどうすればよいですか?
私が達成しようとしているものの最小の例です。
const store$ = new Rx.BehaviorSubject([])
store$.next([
{
id: 1,
items: [
{
id: 1,
title: 'Foo'
},
{
id: 2,
title: 'Bar'
}
]
},
{
id: 2,
items: [
{
id: 3,
title: 'Fizz'
},
{
id: 4,
title: 'Buzz'
}
]
},
]);
// Desired output: [ "Foo", "Bar", "Fizz", "Buzz" ]
store$
.filter(({length}) => length > 0)
.flatMap(group => group)
.flatMap(({items}) => items)
.map(({title}) => title)
.subscribe(console.log) // Emits separate values :-(
// No-RxJs approach
store$
.filter(({length}) => length > 0)
.map(groups => groups
.map(
({ items }) => items.map(
({ title }) => title
)
)
.reduce((next, acc) => [ ...acc, ...next ], []))
.subscribe(console.log) // Works as expected.
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.js"></script>
問題は、ストリームが完了しないため、データを減らすことができないことです。完了したストリームでうまくいけば、単に 'toArray()'を呼び出すことができます。私はなぜあなたが2番目の例 "No RxJs"と呼ぶのだろうかと思います。 – zeroflagL
@zeroflagL混乱して申し訳ありませんが、配列を平坦化するためのネイティブ配列メソッドに依存しています。それが主な理由です。 – halfzebra
私は参照してください。その後、完了していないストリームはどうですか? – zeroflagL