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

Τώρα, θέλω να επιλέξω τιμές μεταξύ συγκεκριμένης ιδιότητας. π.χ.: 'Όνομα'

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

Η συνάρτηση selectBetween θα λάβει δύο τιμές συμβολοσειράς. Σε αυτή την περίπτωση, το Person.Name, και θα πρέπει να επιστρέψει όλες τις τιμές μεταξύ των δεδομένων ονομάτων.

π.χ:

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

Πρέπει να επιστρέψει: [Wolfcastle, Stradivarius Cain, Wiggum, McKenna]

Εδώ είναι το παράδειγμα μου στο StackBlitz:

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

Απάντηση #1

Δεν είμαι σίγουρος γιατί θέλεις να εμπλέξεις τις Υποσχέσεις εδώ, αλλά αν πραγματικά θέλεις να το κάνεις, πιθανότατα μπορείς να βρεις έναν τρόπο να κάνεις τη μετατροπή καλύτερα από εμένα, καθώς ποτέ δεν συνδυάζω τα δύο.

Τέλος πάντων, αυτό επιστρέφει ένα παρατηρήσιμο με ένα πίνακα ατόμων που βρέθηκαν ανάμεσα στα δύο δοθέντα ονόματα:

  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

Επεξεργασία: αυτό επιστρέφει ολόκληρα τα αντικείμενα Person, αν θέλετε μόνο τις τιμές των ονομάτων απλώς επεξεργαστείτε την τελευταία γραμμή:

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