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

如何利用多filterBy条件值过滤对象数组?

对象数组多条件组合过滤实现

问题描述

现有员工信息对象数组 arrayData,以及过滤条件数组 filterBy,需要根据 filterBy 中的任意组合条件筛选出符合要求的对象:

  • senior/junior:匹配对应职位的员工
  • missing_contact_info:匹配电话(phone)或地址(address)为空字符串/ null的员工

支持的组合场景包括但不限于:仅筛选senior、senior+junior、全部三个条件、senior+missing_contact_info等。

实现思路

  1. 给每个过滤条件单独定义判断逻辑,便于后续维护扩展
  2. 遍历原始数组,检查每个对象是否满足filterBy中的至少一个条件(组合条件为“或”关系)
  3. 兼容filterBy为空数组的情况,直接返回原数组

代码实现

const arrayData = [
  {
    name: 'abc',
    designation: 'senior',
    phone: '3589234556',
    address: 'Address 1'
  },
  {
    name: 'pqr',
    designation: 'junior',
    phone: '',
    address: 'Address 2'
  },
  {
    name: 'xyz',
    designation: 'senior',
    phone: '3589234557',
    address: ''
  }
];

// 定义各过滤条件的判断规则
const conditionCheckers = {
  senior: item => item.designation === 'senior',
  junior: item => item.designation === 'junior',
  missing_contact_info: item => {
    const isPhoneEmpty = item.phone === '' || item.phone === null;
    const isAddressEmpty = item.address === '' || item.address === null;
    return isPhoneEmpty || isAddressEmpty;
  }
};

// 通用过滤函数
const filterEmployees = (data, filterBy) => {
  if (!filterBy.length) return [...data];
  return data.filter(item => filterBy.some(condition => conditionCheckers[condition](item)));
};

// 测试各场景
console.log("仅senior:", filterEmployees(arrayData, ['senior']));
console.log("senior+junior:", filterEmployees(arrayData, ['senior','junior']));
console.log("全部条件:", filterEmployees(arrayData, ['senior','junior','missing_contact_info']));
console.log("senior+缺失联系信息:", filterEmployees(arrayData, ['senior','missing_contact_info']));

代码说明

  • conditionCheckers:把每个过滤条件映射到对应的判断函数,新增条件时只需在这里添加新的键值对即可
  • filterEmployees:核心过滤逻辑,用filter遍历数组,some判断对象是否符合任一筛选条件
  • 测试代码覆盖了所有提到的场景,可直接运行验证结果

内容的提问来源于stack exchange,提问作者Tushar kharat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:15:37