相当于什么
#!/bin/bash
# description: show first/last lines of all the files in a provided directory
if [ $# -ne 3 ]
then
echo "Error: Please provide 3 parameters."
echo "Usage Example: lshead -head 5 [DIR]"
exit
else
operation=$1
lines=$2
directory=$3
if [ "$operation" == "-head" ]
then
head -n $lines $directory/*
elif [ "$operation" == "-tail" ]
then
tail -n $lines $directory/*
fi
fi
在rxjs中?
此刻我像这样“解决”了
array.forEach(element => {
array.forEach(element2 => {
//do something with element and element2
});
});
或
switchMap(array => from(array).pipe(
tap(element => {
array.forEach(element2 => {
//do something with element and element2
})
})
)
(在真实代码let globalArray = [...someObjects];
of(globalArray).pipe(
mergeMap(array => array),
tap(element => {
globalArray.forEach(element2 => {
//do something with element and element2
})
})
)
中是一个传递给函数的数组)
但是在rxjs中这并不是正确的方法。
答案 0 :(得分:2)
如果我正确理解了您的问题,mergeMap
是您要找的运营商。
mergeMap
需要一个返回ObservableInput的函数作为其第一个参数。数组是一个ObservableInput。返回数组时,mergeMap
将数组展平并发出每个项作为单独的通知。
所以下面的代码应该可以满足您的需求
of(arrayOfArraysOfNumbers)
.pipe(
mergeMap(arrayOfArrays => arrayOfArrays),
mergeMap(array => array)
)
.subscribe(console.log)
这里是example。
更新-两次阵列重复出现
其中您必须循环相同的数组两次,您可能会看到类似的情况
function closureForArray(arrayOfElements: Array<any>) {
return from(arrayOfElements).pipe(
mergeMap(e1 => from(arrayOfElements).pipe(
map(e2 => ({e1, e2}))
))
)
}
of(arrayOfElements)
.pipe(
switchMap(closureForArray),
map(({e1, e2}) => // do something with e1 and e2)
)
这里的基本思想是closureForArray
函数将arrayOfElements
保留在范围内,因此可以两次应用from
RxJS函数,一个运行第一个循环,另一个运行第一个循环。从第一个循环开始的第二个循环。