如何基于键值为数组的过滤条件,筛选对象数组中匹配任意规则的元素
实现方案
核心逻辑梳理
- 先过滤掉
filter中的空数组字段,空字段不参与匹配 - 对每个待筛选的数据项,只要任意一个有效过滤字段和对应filter字段存在公共元素,就保留该数据项
- 用Set存储过滤值优化匹配效率,避免数组遍历的性能损耗
完整可运行代码
function filterData(filter, data) { // 预处理过滤条件:仅保留非空字段,转成Set优化查找效率 const validConditions = Object.fromEntries( Object.entries(filter) .filter(([_, filterValues]) => filterValues.length > 0) .map(([filterKey, filterValues]) => [filterKey, new Set(filterValues)]) ) // 无有效过滤条件时直接返回全部数据,可根据需求调整为返回空数组 if (Object.keys(validConditions).length === 0) { return [...data] } // 执行筛选 return data.filter(item => { // 只要任意一个字段匹配成功就保留当前项 return Object.entries(validConditions).some(([key, conditionSet]) => { const itemFieldValues = item[key] || [] return itemFieldValues.some(val => conditionSet.has(val)) }) }) }
调用示例
// 测试用例 const testFilter = {filter1:["mine"], filter2:["F","D"]} const testData = [ { id:1, filter1:["mine"], filter2:["E","C"]}, { id:2, filter1:["mine"], filter2:["E","C","F"]}, { id:3, filter1:["your"], filter2:["C"]}, { id:4, filter1:["your"], filter2:["D","C"]}, { id:5, filter1:["other"], filter2:["F"]}, ] console.log(filterData(testFilter, testData)) // 输出与示例要求一致的结果
内容的提问来源于stack exchange,提问作者Mohammad Zubair
相关产品推荐
相关产品推荐

