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

Posted

技术标签:

【中文标题】对象数组按另一个数组值过滤【英文标题】: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<string>;
  data: Array<string>;

您可以修改 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 更新。【参考方案2】:
prod.map((x)=>
    x.title.map((y)=>
        part.map((z)=>
            if(y == z.title && x.id == 1)
                x.data.push(z.data)
            
            if(y == z.title && x.id == 2)
                x.data.push(z.data)
            
        )
    )
)
change prod to this add data:[]
[
    
      id: 1,
      name: 'item1',
      title: ['param1', 'param3'],
      data:[]
    ,
    
      id: 2,
      name: 'item2',
      title: ['param2', 'param3'],
      data:[]
    
  ]

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 谢谢,它正在工作。虽然我不明白为什么需要第二个“if”,因为代码在没有它并且没有第二个参数“&& x.id == 1”的情况下工作。

以上是关于对象数组按另一个数组值过滤的主要内容,如果未能解决你的问题,请参考以下文章

Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

基于嵌套值的数组过滤对象数组

根据来自不同对象数组的属性和值过滤对象数组

如何使用Javascript中的数组值过滤对象?

基于多值对象过滤javascript对象数组

Mongoose:如果值存在于对象数组中的数组中,则过滤数据