如何过滤嵌套数组对象用于FlatList,实现仅针对body字段的搜索功能
问题原因
你原有代码存在两个核心错误:
- 直接对
message对象调用toUpperCase()方法,普通对象没有字符串的该方法,运行会直接报错 - 没有指定匹配
results子项的body字段,匹配逻辑完全不符合需求
符合需求的实现代码
如果你的需求是只要分组内有任意一条results子项的body匹配关键词,就保留整个分组的完整内容,和你给出的示例输出一致,可以直接用以下代码:
if (userInput) { // 统一转大写避免大小写敏感,仅需转换一次降低性能消耗 const inputUpperCase = userInput.toUpperCase() const newData = messages.filter(message => { // 检查当前分组的results中是否存在至少一个匹配的子项 return message.results.some(item => item.body.toUpperCase().includes(inputUpperCase) ) }) setFilteredData(newData) } else { setFilteredData(messages) }
变种逻辑(按需选用)
如果你需要同时过滤掉分组内不匹配的results子项,仅保留匹配的内容,可以使用以下变种代码:
if (userInput) { const inputUpperCase = userInput.toUpperCase() const newData = messages.reduce((result, currentGroup) => { // 先过滤出当前分组下匹配的results子项 const matchedItems = currentGroup.results.filter(item => item.body.toUpperCase().includes(inputUpperCase) ) // 仅当分组内有匹配内容时,才加入最终结果 if (matchedItems.length) { result.push({ ...currentGroup, results: matchedItems, resultsCount: matchedItems.length }) } return result }, []) setFilteredData(newData) } else { setFilteredData(messages) }
内容的提问来源于stack exchange,提问作者ilvthsgm
相关产品推荐
相关产品推荐

