如何用JavaScript按多属性比较两个对象数组并筛选目标对象
问题修正方案
你的尝试代码逻辑是筛选arrobj1中grp与arrobj2内任意ISACTIVE为true的对象的SERVICE属性相等的条目,但根据你的预期结果,实际需求应该是:筛选arrobj1中同时满足id等于arrobj2里ISACTIVE为true的对象的TASK,且grp等于对应SERVICE的对象。
修正后的代码
方案一:高效匹配(适合大数据量)
先提取arrobj2中活跃对象的TASK-SERVICE映射,再快速匹配:
// 提取arrobj2中ISACTIVE为true的任务与服务映射 const activeTaskServiceMap = new Map( arrobj2.filter(item => item.ISACTIVE) .map(item => [item.TASK, item.SERVICE]) ); // 筛选arrobj1中符合条件的对象 const result = arrobj1.filter(obj => { const matchedService = activeTaskServiceMap.get(obj.id); return matchedService && matchedService === obj.grp; });
方案二:简洁写法(适合小数据量)
直接在filter中嵌套some完成双重条件判断:
const result = arrobj1.filter(obj => arrobj2.some(item => item.ISACTIVE === true && obj.id === item.TASK && obj.grp === item.SERVICE ) );
结果验证
运行上述代码后,针对你提供的示例数据,得到的结果与你的预期完全一致:
[ { id:"SetupFS", grp:"fs", title: "xxx" } ]
原代码问题说明
你原来的代码只判断了grp === SERVICE和ISACTIVE === true,会把arrobj1中所有grp="fs"的对象都筛选出来(也就是前两个条目),这和你的预期结果不符,因此需要补充id === TASK的匹配条件。
内容的提问来源于stack exchange,提问作者code44
相关产品推荐
相关产品推荐

