我有一个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);