有这个:
Observable.combineLatest(localArray.map((i) => {
return <Observable that returns $value> }))
.map((statuses) => {
return statuses.filter((status) => {
return status.$value === CONDITION
});
}).subscribe((eligible: any[]) => {
...
是否可以将预订结果映射回
localArray
?我想知道哪个eligible
项目属于哪个localArray
条目...谢谢您的帮助。
我在某处读到该命令已用
combineLatest
保留。但是,使用forEach
直接映射到索引将不起作用,因为如果满足条件,则eligible
结果的返回长度可能与localArray
不同。我总是可以删除
.map()
并在subscribe
块中进行过滤,这将使我能够遍历localArray
并直接使用eligible
数据进行更新,例如:localArray.forEach((ai, i) => { ai.eligible = eligible[i] })
最佳答案
一,代码:
Observable
// Turn an array, promise, or iterable into an observable.
.from(localArray)
// Map values to inner observable, subscribe and emit in order.
.concatMap((arrayElement: any) => {
// Returning an observable that returns a value
return Observable.of(arrayElement);
})
// Emit only values that meet the provided condition.
.filter((value: any) => {
return value === 'Some condition';
})
// Reduces the values from source observable to a single value that's emitted when the source completes.
// If you need the current accumulated value on each emission, try scan - https://www.learnrxjs.io/operators/transformation/scan.html
// The second argument here is the seed, the initial value provided the first time reduce is called. (In this case, an empty array)
.reduce((filteredValue: any, accumulatedFilteredValues: any[]) =>{
accumulatedFilteredValues.push(filteredValue);
return accumulatedFilteredValues;
}, [])
.subscribe((filteredValueArray: any[]) => {
// Do something with the array of ordered, filtered values
});
首先,我创建了一个可观察对象,以使用from发出
localArray
中的每个arrayElement。当每个
arrayElement
发出时,我将该arrayElement
映射到一个Observable,它将返回一些value
(在这种情况下,我只返回arrayElement)。我正在使用concatMap,因为它会订阅内部的observable并在它们完成后按照发出的顺序发出它们的值。我使用filter仅发出满足条件的
value
。筛选器采用返回true
或false
的函数。如果返回true
,将发出value
。最后,我使用reduce收集
filteredValue
并将其添加到accumulatedFilteredValues
数组中。 Reduce将函数作为第一个参数,并将可选种子作为第二个参数。传递给reduce的函数将最新的发射(filteredValue)作为其第一个参数,并将累积值作为第二个参数(空数组[])
在将这些运算符应用于发射值之后,传递给subscribe的函数将接收一个数组,该数组包含来自
localArray
的筛选后的有序项目。learn-rxjs是出色的RxJS资源,其中包含各种运算符的示例和说明。
如果您使用的RxJS> = 5.5,请考虑使用pipeable operators。在这种情况下,代码看起来更接近于此:
from(localArray).pipe(
concatMap((arrayElement: any) => {
return Observable.of(arrayElement);
}),
filter(value => {
return value === 'Some condition';
}),
reduce((filteredValue: any, accumulatedFilteredValues: any[]) => {
accumulatedFilteredValues.push(filteredValue);
return accumulatedFilteredValues;
}, [])
)
.subscribe((filteredValueArray: any[]) => {
// Do something with the array of ordered, filtered values
});