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函数将取两个sting值。在本例中,Person.Name和应该返回给定名称之间的所有值。

例句:

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

应该回归:[狼堡,凯恩,威格姆,麦肯纳]

下面是我的StackBlitz示例:

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

我不知道你为什么要在这里涉及Promises,但如果你真的想这样做,你可能会找到一种比我更好的方法来完成转换,因为我从来没有把两者混在一起。

无论如何,这将返回一个可观察对象,其中包含介于两个给定名称之间的人员数组:

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

最新更新