JSON多层结构搜索函数问题:二级结构搜索失效返回全量数据
问题分析与修复方案
你的代码存在几个关键错误,直接导致二级结构搜索失效并返回全部数据:
value()调用错误:inputUser.target.value是DOM元素的属性而非方法,不需要加括号,应改为inputUser.target.value。- 二级结构遍历逻辑完全错误:
data.components是数组,Object.keys(component)拿到的是数组索引(0、1),但你用data[key]访问的是外层机器对象的属性,根本没触及components里的子对象。- 正确逻辑是遍历
components数组里的每个子对象,再检查子对象的属性值。
- 字符串处理错误:
trim是方法必须加(),且需把输入和目标值都转成小写,避免大小写敏感问题。 - 变量命名冲突:filter回调参数用
data会和外层的data变量混淆,改成item更清晰。
下面是兼顾一级、二级结构搜索的修复版代码:
const search = (inputUser, data, setReturninfo) => { // 处理输入:转小写+去除首尾空格 const input = inputUser.target.value.toLowerCase().trim(); // 空输入直接返回全部数据 if (!input) { setReturninfo([...data]); return; } const result = data.filter((item) => { // 检查一级结构的非对象属性值 const matchFirstLevel = Object.values(item).some(value => typeof value !== 'object' && value.toString().toLowerCase().trim().includes(input) ); // 检查二级components的所有属性值 const matchSecondLevel = item.components.some(component => Object.values(component).some(value => value.toString().toLowerCase().trim().includes(input) ) ); // 一级或二级匹配则保留当前对象 return matchFirstLevel || matchSecondLevel; }); setReturninfo(result); }
代码说明:
- 输入处理:统一转小写+trim,空输入返回全量数据,提升用户体验。
- 一级结构检查:跳过
components这类对象属性,只检查字符串/数值类型的属性值。 - 二级结构检查:遍历
components数组的每个子对象,逐一检查其属性值是否匹配输入。 - 匹配逻辑:只要当前机器对象的一级或二级结构有匹配项,就会被保留到结果中。
内容的提问来源于stack exchange,提问作者esperanza wiesse
相关产品推荐
相关产品推荐

