ES6中如何判断数组ID是否存在于另一个数组并校验errorMessages
现有代码的问题
- 逻辑错误:
data2.find((data) => data)的回调永远返回真值,只会匹配到data2第一个元素的id,仅能命中id为0111的条目,完全不符合需求 - 缺少核心校验逻辑:没有实现对应条目是否存在有效errorMessages的检查
- 性能较差:每次遍历data1的元素都要全量遍历一次data2,时间复杂度为O(n*m),数据量大时效率极低
最优实现方案
先对data2做预处理生成id映射表,将查找复杂度降到O(1),整体时间复杂度仅为O(n+m),同时逻辑分层清晰易维护:
// 预处理data2生成映射:key为id,value为对应条目是否存在非空errorMessages const idCheckMap = new Map( data2.map(item => [item.id, item.errorMessages?.length > 0]) ) // 过滤data1:同时满足id存在、对应条目有有效错误信息两个条件 const output = data1.filter(item => idCheckMap.get(item.ids)) console.log("output", output)
如果你仅需要校验errorMessages字段是否存在、不需要判断内容是否非空,把映射值的判断规则改成
'errorMessages' in item即可。
如果运行环境不支持Map,也可以用普通对象实现:
const idCheckObj = {} data2.forEach(item => { idCheckObj[item.id] = item.errorMessages?.length > 0 }) const output = data1.filter(item => idCheckObj[item.ids])
方案优势
- 逻辑完全符合需求:同时覆盖id匹配、错误信息校验两个要求
- 性能优异:仅需要各遍历一次data1和data2,数据量越大性能优势越明显
- 可维护性高:校验规则调整仅需要修改映射生成逻辑,不需要改动过滤逻辑
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

