如何使用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
相关产品推荐
相关产品推荐

