对象数组按另一个数组值过滤
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”的情况下工作。以上是关于对象数组按另一个数组值过滤的主要内容,如果未能解决你的问题,请参考以下文章