JavaScript根据条件数组属性值过滤目标数组的实现方法
数组过滤最优实现方案
需求规则
给定条件数组condition与待过滤数组myArray,过滤后保留的对象需满足:至少存在一个condition数组内对象包含的属性键,对应属性值为false。
示例中预期返回id为1、2、4的对象组成的数组。
示例原始代码
const condition = [ { iosSend: true }, { androidSend: true } ] const myArray = [ { androidSend: false, iosSend: true, macosSend: false, id: 1 }, { androidSend: true, iosSend: false, macosSend: false, id: 2 }, { androidSend: true, iosSend: true, macosSend: false, id: 3 }, { androidSend: false, iosSend: false, macosSend: true, id: 4 } ]
实现代码
// 提前提取所有需要校验的属性键,仅执行1次,避免循环内重复计算 const checkKeys = condition.flatMap(item => Object.keys(item)) const filteredResult = myArray.filter(item => { // some自带短路逻辑,命中第一个符合条件的属性就终止遍历,减少无效判断 return checkKeys.some(key => item[key] === false) })
方案优势
- 性能最优:预处理校验键的逻辑仅执行一次,不会在遍历
myArray每一项时重复解析condition;some方法的短路特性会在找到第一个符合条件的属性后立刻停止当前项的校验,时间复杂度最低 - 可读性强:逻辑拆分清晰,没有冗余嵌套和多余判断
- 扩展性好:后续如果
condition新增需要校验的字段,不需要修改过滤逻辑,自动适配
结果验证
执行代码后返回的数组项:
- id=1:
androidSend值为false,符合规则保留 - id=2:
iosSend值为false,符合规则保留 - id=3:两个校验字段值均为
true,不符合规则被过滤 - id=4:两个校验字段值均为
false,符合规则保留
完全匹配预期结果。
内容的提问来源于stack exchange,提问作者rafaelgara
相关产品推荐
相关产品推荐

