【问题标题】:Rxjs operator: filter array of arrayrxjs操作符:过滤数组的数组
【发布时间】:2021-05-23 03:00:18
【问题描述】:

我有一个包含对象数组的可观察对象。比如下面的伪代码

observable = Observable([[object1, object2], [object3, object4],[object5], [object6]]])

现在,我想映射数组并检查是否 object.name === 'something' 并返回第一次出现。如果列表中没有对象匹配,则返回 undefined。每个数组只返回一个对象。所以输出会像Observable([object2, object3, undefined, object6])。如何使用 rxjs 运算符做到这一点?

【问题讨论】:

  • 不幸的是,你不能一步到位。您可以使用 .map() 运算符,但您必须自己过滤每个数组,然后返回最终数组。

标签: filter rxjs rxjs-observables


【解决方案1】:

我写了一个假设对象是数字的例子。你可以根据你的情况重写它

import { from, Observable } from "rxjs";
import {map} from "rxjs/operators";

function findNumber(source: Observable<number[]>, num: number) {
   return source.pipe(
      map( arr => arr.find( n => n===num) )
   )
}

const source = from([[1, 2], [1, 2, 3], [3], [4, 1], [5, 2]]);
findNumber(source, 1).subscribe(next => console.log(next));

https://stackblitz.com/edit/typescript-5a3nwz?file=index.ts

【讨论】:

    【解决方案2】:

    没有一个操作员可以做您正在寻找的事情,但也许这样的事情可以工作

    observable = Observable([[object1, object2], [object3, object4],[object5], [object6]]])
    
    observable.pipe(
      // switchMap so that you move to another observable, which emits on of the contained arrays at the time
      switchMap(arrayOfArrays => from(arrayOfArrays)),
      // map each array to the first occurence of the element you are looking for
      map(array => array.first(el => el.whatever === whateverValue),
      // use toArray to get again an array
      toArray()
    )
    

    或者,您可以使用 JS 数组方法并执行类似的操作

    observable = Observable([[object1, object2], [object3, object4],[object5], [object6]]])
    
    observable.pipe(
      map(arrayOfArrays => arrayOfArrays.map(
        array => array.first(el => el.whatever === whateverValue))
      )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2016-10-25
      相关资源
      最近更新 更多