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

如何使用Regex对包含嵌套结构的对象数组进行搜索过滤?

多字段正则匹配搜索实现方案

实现思路

  • 先对用户输入的关键词做正则特殊字符转义,避免特殊符号导致正则逻辑异常
  • 构造不区分大小写的正则实例,适配大小写混合输入的场景
  • 遍历账号数组,优先匹配账号层的accountNumber字段
  • 若账号层未匹配,遍历该账号下所有用户,匹配id、email、name三个字段,任意字段匹配成功则保留该账号

完整代码

// 正则特殊字符转义工具函数
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

/**
 * 账号过滤函数
 * @param {string} searchKeyword 搜索框输入的关键词
 * @param {Array} accountData 原始账号数据集
 * @returns {Array} 过滤后的账号数组
 */
function filterAccounts(searchKeyword, accountData) {
  // 空关键词直接返回全部数据
  if (!searchKeyword.trim()) return accountData;

  // 构造不区分大小写的匹配正则
  const matchRegex = new RegExp(escapeRegExp(searchKeyword), 'i');

  return accountData.filter(account => {
    // 匹配账号层的accountNumber字段
    if (matchRegex.test(String(account.accountNumber))) {
      return true;
    }
    // 匹配该账号下所有用户的id、email、name字段
    return account.users.some(user => {
      return matchRegex.test(String(user.id)) 
        || matchRegex.test(user.email) 
        || matchRegex.test(user.name);
    });
  });
}

// 测试数据集(已修正原数据的语法错误)
const accountData =  [
  {
    accountNumber: 123,
    users: [
      {id: 1, email: 'xyz@aol.com', name: 'bob'},
      {id: 2, email: 'dfg@gmail.com', name: 'tomas'}
    ]
  },
  {
    accountNumber: 345,
    users: [
      {id: 3, email: 'abc@yahoo.com', name: 'mark'},
      {id: 4, email: 'dfg@gmail.com', name: 'peter'},
      {id: 5, email: 'gdfgfgd@gmail.com', name: 'tom'}
    ]
  }
]

效果验证

// 输入tom,返回两个账号
console.log(filterAccounts('tom', accountData));
// 输入tomas,仅返回accountNumber为123的账号
console.log(filterAccounts('tomas', accountData));
// 输入345,仅返回accountNumber为345的账号
console.log(filterAccounts('345', accountData));
// 输入dfg@gmail.com,返回两个关联账号
console.log(filterAccounts('dfg@gmail.com', accountData));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:30:05