JS section list格式嵌套对象数组搜索功能实现疑问
原有代码问题点
- 包含判断逻辑倒置:原代码写的是
query.includes(c.description),是判断搜索关键词中是否包含完整的条目描述,和需求完全相反,应该判断条目描述是否包含搜索关键词。 - 筛选逻辑不符合要求:使用
every要求当前分组下所有条目都满足条件才保留分组,且没有对分组内的条目做过滤,会返回分组内所有不匹配的内容。
修正实现代码
const sectionList = [ { caption: 'caption1', data: [ { id: '1', title: 'Payment', description: 'Pay info' }, { id: '2', title: 'Refund', description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta et ipsam voluptate commodi nulla asperiores corporis, sapiente quasi obcaecati quae totam consequatur cum, perspiciatis pariatur !' }, { id: '3', title: 'Mobs', description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta et ipsam voluptate commodi nulla asperiores corpori!' }, { id: '4', title: 'test', description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta et ipsam voluptate commodi nulla' }, ], }, { caption: 'caption2', data: [ { id: '5', title: 'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Recusandae eveniet?', description: 'Custom desc' }, ], }, ]; const query = 'Lorem ipsum' // 可选:转小写实现大小写不敏感搜索 const normalizedQuery = query.toLowerCase() const res = sectionList.reduce((result, currentSection) => { // 过滤当前分组下匹配的条目 const matchedItems = currentSection.data.filter(item => { // 如需同时匹配标题可放开下方注释 // return item.title.toLowerCase().includes(normalizedQuery) || item.description.toLowerCase().includes(normalizedQuery) return item.description.toLowerCase().includes(normalizedQuery) }) // 仅当分组下存在匹配条目时,才保留该分组 if (matchedItems.length) { result.push({ ...currentSection, data: matchedItems }) } return result }, []) console.log(res)
逻辑说明
- 遍历所有分组,逐个对分组内的条目做过滤,只保留描述包含搜索关键词的条目
- 过滤后如果当前分组没有匹配的条目,直接丢弃该分组
- 保留的分组会替换原data字段为匹配后的条目列表,最终返回的结构和原结构保持一致,完全符合预期输出要求
内容的提问来源于stack exchange,提问作者lecham
相关产品推荐
相关产品推荐

