【问题标题】:How to filter an array of objects and return the array of objects using typescript如何过滤对象数组并使用打字稿返回对象数组
【发布时间】:2021-05-24 10:33:51
【问题描述】:

您好,我想知道是否有人可以帮助我过滤一组对象。 当我执行以下操作时,它会返回一个数组数组而不是我需要进行特定显示的对象数组

 public ngOnInit(): void {
this.checkboxItems.map(x =>
  x.formControl.valueChanges.subscribe((state: boolean) => {
    const filterOption = Object.keys(x.formControl.parent.controls).find(key => x.formControl.parent.controls[key] === x.formControl);
    console.log('test', state, filterOption);
    if (state && filterOption) {
      this.activatedRoute.data?.pipe(takeUntil(this.destroy$)).subscribe((data: Data) => {
        this.timelineModificationsPerYear = data.verticalTimeline?.verticalTimelineModificationPerYears;
        this.timelineModificationsPerYear = this.timelineModificationsPerYear.map(verticalTimelineModificationPerYear =>
          verticalTimelineModificationPerYear.verticalTimelineModifications?.filter(
            verticalTimelineType => verticalTimelineType.type.toLowerCase() === filterOption
          )
        );

        console.log('filter', this.timelineModificationsPerYear);
      });
    }
  })
);

}

【问题讨论】:

  • 你是mapping 而是过滤。这里你要看看this.timelineModificationsPerYear.map
  • @gorak 我试过 this.timelineModificationsPerYear = this.timelineModificationsPerYear.filter(verticalTimelineModificationPerYear => verticalTimelineModificationPerYear.verticalTimelineModifications?.filter(verticalTimelineType => verticalTimelineType.type.toLowerCase() === filterOption) 但是这确实返回了对象数组,但如果类型与filterOptions匹配,则不会根据条件进行真正的过滤。它返回原始对象。你能帮忙吗?谢谢

标签: javascript arrays angular typescript filter


【解决方案1】:

我在这里看到了多个问题:

  1. 您有嵌套订阅。最好使用像switchMap 这样的高阶映射运算符来避免多次订阅。

  2. 您在循环内有订阅。这又会导致在组件关闭时需要处理多个订阅。在这里你可以使用像forkJoin这样的函数。

  3. 手头的问题,数组数组。您将每个元素内的数组映射到外部变量。所以它导致数组数组。您可以使用Array#flatMap 而不是Array#map。它类似于map,不同之处在于它将内部数组展平,因此只有一个带有对象的外部数组。

试试下面的

import { forkJoin, NEVER, Subject } from 'rxjs';
import { switchMap, takeUntil } from 'rxjs/operators';

public ngOnInit(): void {
  forkJoin(this.checkboxItems.map(x =>
    x.formControl.valueChanges.pipe(
      switchMap((state: boolean) => {
        const filterOption = Object.keys(x.formControl.parent.controls).find(key => x.formControl.parent.controls[key] === x.formControl);
        return (state && filterOption) ? this.activatedRoute.data : NEVER;
      })
    )
  )).pipe(
    takeUntil(this.destroy$)
  ).subscribe({
    next: (data: Data) => {
      this.timelineModificationsPerYear = data.verticalTimeline?.verticalTimelineModificationPerYears;
      this.timelineModificationsPerYear = this.timelineModificationsPerYear.flatMap(verticalTimelineModificationPerYear => 
        verticalTimelineModificationPerYear.verticalTimelineModifications?.filter(verticalTimeline => 
          verticalTimelineType.type.toLowerCase() === filterOption
        )
      );
    }
  });
}

【讨论】:

  • @Micheal D,在使用 flatMap 时,确实在进行过滤,但是丢失了原始数据结构verticalTimelineModifications key 和 year key 的结构。有没有办法保持对象的原始结构并应用过滤条件
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多