typescript - Rxjs Observable-array välja mellan givna start- och slutvärden


Jag har en Observable-array som ser ut så här:

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')
]);

Nu vill jag välja värden mellan en given egenskap. t.ex.: 'Name'

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

Funktionen selectBetween kommer att ta två strängvärden. I det här fallet Person.Name, och ska returnera alla värden mellan givna namn.

t.ex:

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

Bör returnera: [Wolfcastle, Stradivarius Cain, Wiggum, McKenna]

Här är mitt StackBlitz-exempel:

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

Svar #1

Inte säker på varför du vill involvera Promises här, men om du verkligen vill göra det kan du förmodligen hitta ett sätt att göra konverteringen bättre än jag eftersom jag aldrig blandar de två.

Hur som helst, detta returnerar ett observerbart med en lista över personer som var mellan de två angivna namnen:

  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);
      })
    );
  }

Stackblitz :

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

Redigera: detta returnerar hela Person-objekten, om du bara vill ha namnvärdena, redigera bara sista raden:

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