对象数组按另一个数组值过滤

分享于2022年07月17日 angular javascript 问答
【问题标题】:对象数组按另一个数组值过滤(Array of objects filter by another array values)
【发布时间】:2022-01-23 06:21:03
【问题描述】:

我是 Angular 的新手,并试图用作数组的过滤器值,即在对象内部,它在另一个数组内部。 应该过滤的第二个文件包含对象数组。 例如:

export const PART: Parts [] = [
  {
    title: 'param1',
    data: 'some data', //required information to get
  },
  {
    title: 'param2',
    data: 'other data',
  },
  {
    title: 'param3',
    data: 'another data',
  }
]



export const PROD: Prod[] = [
  {
    id: 1,
    name: 'item1',
    title: ['param1', 'param3']
  },
  {
    id: 2,
    name: 'item2',
    title: ['param2', 'param3']
  }
]
    

预期结果: item1 在它的描述数据中接收:“一些数据”和“另一个数据”。 item2 在它的描述数据中接收:“其他数据”和“其他数据”。 我会在这两个项目的模板中使用方法 *ngFor。

我需要根据标题“param1”将 const PART 中的数据分配给 const PROD 的项目。 不幸的是,我找不到任何适用于这种情况的代码示例。 提前谢谢你。

  • 给定两个数组,你能举一个预期输出的例子吗?

【解决方案1】:

修改PROD类型如下。

export interface PROD {
  id: number;
  name: string;
  title: string[] | Array;
  data: Array;
}

您可以修改 PROD 数组以容纳数据对象,如下所示。

export const PROD: Prod[] = [
 {
  id: 1,
  name: 'item1',
  title: ['param1', 'param3'],
  data: [],
 },
 {
  id: 2,
  name: 'item2',
  title: ['param2', 'param3'],
  data: [],
 },
];

使用以下函数根据标题中的参数将数据分配给 PROD 数组。循环遍历 onInit 中的数组或您各自的函数以分配数据。

findPartWithParams(param: string): any {
 return this.PART.find((e: PART) => e.title === param);
}

ngOnInit() {
  this.PROD.forEach((prod: Prod) => {
    prod.title.forEach((t: string) => {
      prod.data.push(this.findPartWithParams(t).data);
    });
  });
}

我附上了一个工作的 StackBlitz fork 以供参考。

https://stackblitz.com/edit/angular-ivy-12bkcd

  • 我确实尝试了该示例,但在“findPartWithParams(param)”上收到错误“参数 'param' 隐式具有 'any' 类型。”和“(this.findPartWithParams(t).data);”错误“'string'类型的参数不能分配给'never'类型的参数”。
  • 更正,示例在 stackblitz 中工作,但我无法使其在单独的项目中工作。我检查了依赖关系,它们都是一样的。
  • 你能分享一个可能的stackblitz链接吗?您的代码的一个小副本。
  • 正如我之前写的 - 代码在 stackblitz 中运行良好,但在新创建的项目中却不是。尽管两种情况下的代码都是相同的。 stackblitz.com/edit/angular-ivy-xsnrja?file=src/app/…
  • 您提到的关于类型错误的第一条评论。你能检查变量的类型转换吗?我已经修改了答案以适应参数的类型转换。 stackblitz 代码也使用 typecast 更新。