有这个:

 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。筛选器采用返回truefalse的函数。如果返回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
    });

09-25 11:21