如何简化基于搜索字符串过滤对象中字符串和数字字段的函数?
简化对象过滤逻辑的方案
先修正原代码的两处问题
searchString.toLowerCase()不会修改原字符串(字符串是不可变类型),必须将结果赋值给新变量才能生效;- 原函数在
Jobs?.orders不存在时返回undefined,建议统一返回空数组,避免后续处理出现类型异常。
方案一:指定字段列表(推荐,可控性高)
把需要检查的字段名存入数组,用some()遍历检查,新增字段只需在数组中添加,无需修改过滤逻辑:
function filterJobsBySearchQuery(searchString: string) { if (!Jobs?.orders) return []; const lowerSearch = searchString.toLowerCase(); // 定义需要检查的字段集合 const targetFields: Array<keyof typeof Jobs.orders[0]> = [ 'jobID', 'jobDescription', 'activationMethod', 'jobStatusDescription', 'status' ]; return Jobs.orders.filter(item => { return targetFields.some(field => { const value = item[field]; if (value == null) return false; // 跳过null/undefined值 return String(value).toLowerCase().includes(lowerSearch); }); }); }
方案二:自动遍历所有字符串/数字字段(无需手动列字段)
如果希望自动检查对象中所有字符串和数字类型的字段,无需手动维护字段列表,可以用Object.values()遍历对象值,再判断类型后检查:
function filterJobsBySearchQuery(searchString: string) { if (!Jobs?.orders) return []; const lowerSearch = searchString.toLowerCase(); return Jobs.orders.filter(item => { return Object.values(item).some(value => { const valType = typeof value; // 仅检查字符串和数字类型 if (valType !== 'string' && valType !== 'number') return false; return String(value).toLowerCase().includes(lowerSearch); }); }); }
两种方案对比
- 方案一:精准控制要检查的字段,避免误检对象中不需要公开搜索的字段(如内部标识、敏感数据),适合字段明确的场景;
- 方案二:无需维护字段列表,新增字段自动纳入检查,但可能会包含一些不需要搜索的字段,适合对象字段全部需要搜索的场景。
内容的提问来源于stack exchange,提问作者SharePointBeginner
相关产品推荐
相关产品推荐

