将 Array 序列化为元素,使用 RxJS 转换,并将 assemble 元素返回数组
Serialize Array into elements, transform using RxJS, and assemble elements back to array
在 Angular2 中,我有很多 Observable<any[]>
(发出数组的 Observable)在 http.get()
中产生或通过 websocket 操作提供,因此 不 .complete( ) 但随时间发出多个值。
我经常需要使用 RxJS 运算符转换数组中的元素(我不想使用 Array.prototype.* 转换!)和 assemble 将单个元素返回数组,即作为单个实体发出。
但我不知道如何assemble将元素返回数组。
示例:
const n$ = new Subject();
const output = n$
// create an observable emitting the individual elements
// of the array
.mergeMap(n => n)
// some kind of transform on the elements
.distinct((n1, n2) => n1 == n2)
.map(n => n*n)
// how to assemble back to an array here???
// not working:
// .buffer(n$)
// also not working (subject does not complete!)
// .toArray()
output.subscribe(v => console.log(v))
n$.next([1,1,1,2,3]);
n$.next([4,5,5,6]);
// Wanted output:
// [1, 4, 9]
// [16, 25, 36]
如果您有多个值并想要一个值(数组),reduce
toArray
应该是您所追求的:
Rx.Observable.from([0, 1, 1, 2, 3])
.distinct()
.map((n) => n * n)
// .reduce((acc, n) => { acc.push(n); return acc; }, [])
.toArray()
.subscribe((a) => { console.log(a); })
如果你有 Observable<any[]>
,只需将其放入 mergeMap
:
const output = n$
.mergeMap((a) => Rx.Observable.from(a)
.distinct()
.map((n) => n * n)
// .reduce((acc, n) => { acc.push(n); return acc; }, [])
.toArray()
)
.subscribe(a => { console.log(a); });
在 Angular2 中,我有很多 Observable<any[]>
(发出数组的 Observable)在 http.get()
中产生或通过 websocket 操作提供,因此 不 .complete( ) 但随时间发出多个值。
我经常需要使用 RxJS 运算符转换数组中的元素(我不想使用 Array.prototype.* 转换!)和 assemble 将单个元素返回数组,即作为单个实体发出。
但我不知道如何assemble将元素返回数组。
示例:
const n$ = new Subject();
const output = n$
// create an observable emitting the individual elements
// of the array
.mergeMap(n => n)
// some kind of transform on the elements
.distinct((n1, n2) => n1 == n2)
.map(n => n*n)
// how to assemble back to an array here???
// not working:
// .buffer(n$)
// also not working (subject does not complete!)
// .toArray()
output.subscribe(v => console.log(v))
n$.next([1,1,1,2,3]);
n$.next([4,5,5,6]);
// Wanted output:
// [1, 4, 9]
// [16, 25, 36]
如果您有多个值并想要一个值(数组),reduce
toArray
应该是您所追求的:
Rx.Observable.from([0, 1, 1, 2, 3])
.distinct()
.map((n) => n * n)
// .reduce((acc, n) => { acc.push(n); return acc; }, [])
.toArray()
.subscribe((a) => { console.log(a); })
如果你有 Observable<any[]>
,只需将其放入 mergeMap
:
const output = n$
.mergeMap((a) => Rx.Observable.from(a)
.distinct()
.map((n) => n * n)
// .reduce((acc, n) => { acc.push(n); return acc; }, [])
.toArray()
)
.subscribe(a => { console.log(a); });