Rxjs Observable 数组 select 在给定的起始值和结束值之间

Rxjs Observable array select between given start and end values

我有一个如下所示的 Observable 数组:

persons$: Observable<Person[]> = new Observable<Person[]>();
private personSource: BehaviorSubject<Person[]>;

  constructor() {
    this.personSource = new BehaviorSubject<Person[]>([
    new Person('Meenique'),
    new Person('Wolfcastle'),
    new Person('Stradivarius Cain'),
    new Person('Wiggum'),
    new Person('McKenna'),
    new Person('Flanders'),
    new Person('Kent Brockman'),
    new Person('Manjula')
]);

现在,我想 select 给定 属性 之间的值。例如:'Name'

async selectBetween(start: string, end: string): Promise<Person[]> {
// return this.persons$.pipe(map(p => p.Name)).toPromise();
}

selectBetween 函数将采用两个字符串值。在这种情况下,Person.Name 并且应该 return 给定名称之间的所有值。

例如:

const test1 = await this.selectBetween('Wolfcastle', 'McKenna');

应该return:[Wolfcastle, Stradivarius Cain, Wiggum, McKenna]

这是我的 StackBlitz 示例:

https://stackblitz.com/edit/example-rxjs-observable-create-from-scratch-pqvmqj?file=app/app.component.ts

不确定你为什么要在这里涉及 Promise,但如果你真的想这样做,你可能会找到一种比我更好的转换方法,因为我从不混淆两者。

无论如何,这个 returns 一个可观察对象,其中包含两个名字之间的一组人:

  selectBetween(start: string, end: string): Observable<Person[]> {
    return this.persons$.pipe(
      map(pArray => {
        const startIndex = pArray.findIndex(p => p.name === start);
        const endIndex = pArray.findIndex(p => p.name === end);
        return pArray.filter((p, i) => i >= startIndex && i <= endIndex);
      })
    );
  }

堆栈闪电战:

https://stackblitz.com/edit/example-rxjs-observable-create-from-scratch-xq1nvf?file=app/app.component.ts

编辑:这个 returns 整个 Person 对象,如果您只想要名称值,只需编辑最后一行:

return pArray.filter((p, i) => i >= startIndex && i <= endIndex).map(p => p.name);