如何为JavaScript数组搜索函数添加多键值AND查询功能?
改造JavaScript数组查询函数支持多键多值AND查询
嘿,我来帮你把这个函数改成支持多键多值的AND查询,同时还兼容原来的单键单值调用方式。先看看原来的函数存在的小问题:比如嵌套对象的typeof判断写错了(typeof(obj[key] == "object")应该是typeof obj[key] === "object"),还有重复的字符串匹配逻辑,咱们重构一下,让代码更清晰也更健壮。
改造思路
- 兼容两种调用方式:不管传入的是单个键值还是数组形式的多键值,都能处理
- 抽离匹配逻辑:把单个键值对的匹配逻辑做成辅助函数,方便复用,也更容易维护
- 实现AND逻辑:只有当对象满足所有传入的键值条件时,才被加入结果数组
改造后的完整代码
// 假设全局的data数组是你提供的示例数据 const data = [ { "id": 1, "name": "John", "addres": { "code": 1, "status": 1 } }, { "id": 2, "name": "Jery", "addres": { "code": 2, "status": 1 } } ]; // 辅助函数:检查一个对象是否匹配单个键值条件(支持嵌套对象) function matchesCondition(obj, prop, value) { // 先检查当前对象是否直接有这个属性 if (obj.hasOwnProperty(prop)) { const propValue = obj[prop]; // 字符串不区分大小写包含匹配 if (typeof propValue === 'string' && typeof value === 'string') { return propValue.toLowerCase().includes(value.toLowerCase()); } // 严格相等匹配 return propValue === value; } // 如果当前对象没有这个属性,遍历嵌套的对象继续查找 for (const key in obj) { const nestedObj = obj[key]; if (typeof nestedObj === 'object' && nestedObj !== null) { if (matchesCondition(nestedObj, prop, value)) { return true; } } } // 找不到匹配的属性或者值不匹配 return false; } // 改造后的where函数 function where(props, values) { // 兼容单键单值的调用方式,转成数组统一处理 const propList = Array.isArray(props) ? props : [props]; const valueList = Array.isArray(values) ? values : [values]; // 确保键和值的数量一致 if (propList.length !== valueList.length) { console.warn("键和值的数量不匹配,返回空数组"); return []; } return data.filter(obj => { // 实现AND逻辑:所有条件都要满足 return propList.every((prop, index) => { return matchesCondition(obj, prop, valueList[index]); }); }); }
调用示例
- 多键多值AND查询:查找
id=2且status=1的对象
const result1 = where(['id','status'],[2,1]); console.log(result1); // 输出:[{ "id": 2, "name": "Jery", "addres": { "code": 2, "status": 1 } }]
- 原来的单键单值查询:和之前一样正常工作
const result2 = where('status',1); console.log(result2); // 输出:两个对象,因为它们的status都是1
代码说明
- 辅助函数
matchesCondition用了递归的方式查找嵌套对象里的属性,不管嵌套多少层都能找到 filter结合every方法完美实现了AND逻辑:只有当所有条件都返回true时,这个对象才会被保留- 加入了参数校验,如果键和值的数量不一致,会给出警告并返回空数组,避免逻辑错误
内容的提问来源于stack exchange,提问作者limey in
相关产品推荐
相关产品推荐

