Rxjs Observable 数组在给定的开始和结束值之间进行选择
Posted
技术标签:
【中文标题】Rxjs Observable 数组在给定的开始和结束值之间进行选择【英文标题】:Rxjs Observable array select between given start and end values 【发布时间】:2021-10-02 07:46:28 【问题描述】:我有一个 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
【问题讨论】:
这与 RxJS 无关,或者问题出在哪里?您只需从数组中收集项目并返回它们。 在什么情况下一个名字“小于”另一个名字?是否仅基于数组中的位置? 【参考方案1】:不知道你为什么要在这里加入 Promise,但如果你真的想这样做,你可能会找到一种比我更好的方法来完成转换,因为我从不将两者混为一谈。
无论如何,这会返回一个 observable,其中包含两个给定名称之间的人员数组:
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
编辑:这将返回整个 Person 对象,如果您只想要名称值,只需编辑最后一行:
return pArray.filter((p, i) => i >= startIndex && i <= endIndex).map(p => p.name);
【讨论】:
这只有在数组已经按名称排序时才有效。给定来自 OP 的数组,通过‘Wolfcastle’, ‘Wiggum’
,使用此代码,结果将包括“Stradivarius Cain”,这似乎不直观。
@HereticMonkey 这显然是 OP 从他给出的例子中想要的:“const test1 = await this.selectBetween('Wolfcastle', 'McKenna');
应该返回:[Wolfcastle, Stradivarius Cain, Wiggum, McKenna]”以上是关于Rxjs Observable 数组在给定的开始和结束值之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章
在 RxJS Observable 中“展平”数组的最佳方法
如何在 Angular 4 中推送到数组的 Observable? RxJS
RxJS 将 observable 附加到 typescript 中的 observable 数组列表