You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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]);
    });
  });
}

调用示例

  1. 多键多值AND查询:查找id=2且status=1的对象
const result1 = where(['id','status'],[2,1]);
console.log(result1); 
// 输出:[{ "id": 2, "name": "Jery", "addres": { "code": 2, "status": 1 } }]
  1. 原来的单键单值查询:和之前一样正常工作
const result2 = where('status',1);
console.log(result2);
// 输出:两个对象,因为它们的status都是1

代码说明

  • 辅助函数matchesCondition用了递归的方式查找嵌套对象里的属性,不管嵌套多少层都能找到
  • filter结合every方法完美实现了AND逻辑:只有当所有条件都返回true时,这个对象才会被保留
  • 加入了参数校验,如果键和值的数量不一致,会给出警告并返回空数组,避免逻辑错误

内容的提问来源于stack exchange,提问作者limey in

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:52:43