如何基于动态键值对数组过滤对象数组?
解决方案:基于多条件同时匹配过滤对象数组
你的核心问题是当前代码实现了满足任一筛选条件的逻辑(OR),但需要的是同时满足所有筛选条件的逻辑(AND)。以下是两种可行的解决方案,包含原生JavaScript和Lodash实现:
一、原生JavaScript实现
直接利用数组的filter和every方法,检查每个对象是否符合所有筛选规则:
// 原筛选条件格式:{type: 2, style: 4} const cleanedFilters = { type: 2, style: 4 }; // 将筛选条件转为键值对数组,方便遍历检查 const filterRules = Object.entries(cleanedFilters); // 过滤目标数组,仅保留同时满足所有条件的对象 const result = searchResults.filter(item => { return filterRules.every(([key, expectedVal]) => { // 处理类型转换:将筛选值转为与对象属性一致的数字类型 return item.hasOwnProperty(key) && item[key] === parseInt(expectedVal); }); });
逻辑说明
filter遍历目标数组的每个对象every确保当前对象全部满足筛选规则中的键值匹配,只要有一个规则不满足就会被排除
二、Lodash实现(更简洁)
Lodash提供了更便捷的工具函数,根据是否需要类型转换分两种场景:
场景1:筛选值与对象属性类型一致(如均为数字)
直接使用_.filter配合_.matches:
const cleanedFilters = { type: 2, style: 4 }; const result = _.filter(searchResults, _.matches(cleanedFilters));
场景2:需要处理类型转换(如筛选值是字符串,对象属性是数字)
用_.every确保所有条件同时满足:
const cleanedFilters = { type: 2, style: 4 }; const result = _.filter(searchResults, item => { return _.every(cleanedFilters, (expectedVal, key) => { return item[key] === parseInt(expectedVal); }); });
原代码问题分析
你之前的map+filter+flatten逻辑,是把每个筛选条件单独过滤出的结果合并,本质是逻辑或(OR),所以会返回满足任一条件的对象。而every方法则是强制所有条件必须同时成立,实现**逻辑与(AND)**的需求。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

