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) =&gt; i &gt;= startIndex &amp;&amp; i &lt;= endIndex).map(p =&gt; 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 数组上的简单过滤器

在 RxJS Observable 中“展平”数组的最佳方法

如何在 Angular 4 中推送到数组的 Observable? RxJS

RxJS 将 observable 附加到 typescript 中的 observable 数组列表

什么是使用 RxJS 在包含数组的 Observable 上迭代(并应用一些逻辑)的优雅解决方案?

我可以使用 rxjs 针对 id 的字符串数组过滤 Observable