【问题标题】:using rxjs and distinctUntilChanged to get items from api call使用 rxjs 和 distinctUntilChanged 从 api 调用中获取项目
【发布时间】:2020-10-19 17:29:22
【问题描述】:

我是学习 rxjs 操作的新手,我正在尝试使用 rxjs 来获取不同的项目。

我从我的 api 调用中获取以下数据

[0 … 99]
0: {option: "OptionOne", subOption: "subOption11"}
1: {option: "OptionOne", subOption: "subOption12"}
2: {option: "OptionTwo", subOption: "subOption21"}
3: {option: "OptionTwo", subOption: "subOption22"}
...
...
...

API 调用

  getOptions(): Observable<Options> {
    const url = `https://localhost:5001/api/options/`;
    return this.http.get<Options>(url).pipe(map((item) => item));
  }

我正在尝试获取选项和子选项。我在 component.ts 文件中按以下方式设置了代码

  getDistinctOptions(data: Options) {
    const source$ = from([data]);
    source$.pipe(distinctUntilKeyChanged('option')).subscribe(console.log);
  }

如何循环并获得不同的选项?

【问题讨论】:

  • 为什么你的 API 调用 map(item =&gt; item) - 这是做什么的?
  • @MrkSef,映射传入的数据?
  • @JeffBenister 地图用于在您的情况下转换您的数据,它基本上不会改变任何东西,您可以只是 return this.http.get&lt;Options&gt;(url) 您所说的不同项目是什么意思?
  • @Elmehdi,我有多个选项(如 optionOne、optiontwo、optionThree ),但我希望它们只返回一次。如果我有 100 条记录,但只有 10 个选项(optionOne...optionTen),我想返回这十个选项。谢谢你,我会在我的代码中改变它。
  • @JeffBenister 所以你想删除重复的?

标签: angular rxjs


【解决方案1】:

如果我理解正确并且对/api/options 的调用返回一个Options 类型,如下所示:

type Options = Array<{ option: string; subOption: string }>;

那么使用 RxJS 的一种方法是:

getDistincOptions(): Observable<Options> {
  const url = `https://localhost:5001/api/options/`;
  return this.http.get<Options>(url).pipe(
    mergeMap(options => options),
    distinct(item => item.option),
    toArray()
  );
}

或者,如果您只想返回具有不同选项的字符串数组:

getDistincOptions(): Observable<string[]> {
  const url = `https://localhost:5001/api/options/`;
  return this.http.get<Options>(url).pipe(
    map(options => [...(
      new Set(options.map(
        item => item.option
      ))
    )])
  );
}

【讨论】:

猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多