You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤嵌套数组对象用于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:18:01