我想从([1,2,3,[4,5],6])的嵌套rxjs开始,并在订阅时以扁平数组结束。即:(1、2、3、4、5、6]
这是我的尝试
from([1,2,3,[4,5],6]).pipe(
mergeMap(
item => item || from(item),
toArray()
).subscribe(res => console.log("res", res)
) // want to print [1,2,3,4,5,6]
效果很好。
from([1,2,3,[4,5],6]).pipe(
mergeMap(
item => typeof item === 'number' ? of(item) : of(...item)
),
toArray()
).subscribe(res => console.log("res", res))
我不确定这是否是最好的解决方案。
下面是使用SCAN的工作解决方案
import { from, scan } from 'rxjs';
from([1, 2, 3, [4, 5], 6])
.pipe(
scan((a, c) => {
return Array.isArray(c) ? [...a, ...c ] : [...a, c ]} , []
),
last()
).subscribe((res) => console.log('res', res));
https://stackblitz.com/edit/rxjs-vnhxza?file=index.ts
我们也可以使用Array.prototype.flat(除非我们需要IE支持):
from([1, 2, 3, [4, 5], 6])
.pipe(
// Will wait wait until last array element and it will emit the whole array
toArray(),
// Array.prototype.flat will flat an array (supported in all browsers except IE)
map(a => a.flat())
).subscribe((res) => console.log('res', res));