如何基于动态配置的多个对象key实现startsWith前缀过滤匹配
动态匹配搜索逻辑实现方案
核心逻辑通过遍历配置的searchKey数组,判断任意指定字段是否满足前缀匹配规则即可,同时可做性能优化和异常兼容处理,改造代码如下:
// 外部可动态修改的匹配字段配置 const searchKey = ['code', 'description', '自定义字段1', '自定义字段2'] function isMatch(obj) { // 提前处理搜索词为小写,避免循环中重复执行转小写逻辑 const formattedSearch = search.toLowerCase() // 用some方法遍历匹配字段,只要有一个满足条件即返回true return searchKey.some(key => { // 兼容对象不存在对应key、字段不是字符串的异常场景 const fieldValue = obj[key] if (typeof fieldValue !== 'string') return false return fieldValue.toLowerCase().startsWith(formattedSearch) }) }
如果需要更高的复用性,支持不同搜索场景传不同配置,可以封装为通用匹配生成函数:
/** * 生成匹配函数 * @param {Array<string>} searchKey 要参与匹配的字段数组 * @param {string} search 搜索关键词 * @returns {Function} 匹配判断函数 */ function createIsMatch(searchKey, search) { const formattedSearch = search.toLowerCase() return function(obj) { return searchKey.some(key => { // ES2020+ 可选链写法更简洁,不支持的环境替换为上面的显式判断即可 return obj[key]?.toLowerCase?.().startsWith(formattedSearch) ?? false }) } } // 使用示例 const isMatch = createIsMatch(['code', 'description', 'price'], '关键词') const filterResult = dataList.filter(isMatch)
内容的提问来源于stack exchange,提问作者Rox
相关产品推荐
相关产品推荐

