AngularJS中基于偏好数组过滤对象数组及可选条件过滤问题
问题解决与扩展实现
一、修复初始过滤逻辑
你的代码存在两个关键问题,导致无法得到预期结果:
b.type是数组类型,直接用==和字符串类型的a.type对比永远不成立,需要用数组的includes()方法检查是否包含目标值;- 箭头函数使用大括号但未显式写
return,回调函数默认返回undefined,导致some()判断始终为假。
修复后的代码:
const filtered = products.filter(a => this.preferences.some(b => b.type?.includes(a.type) // 可选链避免无type属性的偏好项抛出错误 ) );
运行后即可得到id为1的目标对象。
二、扩展支持多字段过滤(新增name条件)
当偏好数组包含多个不同字段的条件时,我们需要判断对象满足任意一个偏好条件即可(比如匹配type规则,或匹配name规则)。可以通过遍历每个偏好项,提取对应的字段和允许值数组,检查当前对象的对应字段是否在数组内。
实现代码:
const filtered = products.filter(product => this.preferences.some(preference => { // 取出偏好项中的唯一字段(每个偏好项仅包含一个字段,如type或name) const [field, allowedValues] = Object.entries(preference)[0]; // 验证产品对应字段是否在允许值数组中 return allowedValues.includes(product[field]); }) );
可选:改为“满足所有偏好条件”
如果需要对象同时符合所有偏好规则(即既匹配type又匹配name),只需将some()替换为every():
const filtered = products.filter(product => this.preferences.every(preference => { const [field, allowedValues] = Object.entries(preference)[0]; return allowedValues.includes(product[field]); }) );
内容的提问来源于stack exchange,提问作者user20256558
相关产品推荐
相关产品推荐

