基于Node.js实现JSON文件数据库的搜索栏功能问题求助
问题分析与解决方案
你的核心问题出在filter方法的判断条件上,咱们来拆解一下:
原来的代码:
let filteredProducts = allProducts.filter(x => x.title == x.title.indexOf(userSearch))
这里x.title.indexOf(userSearch)会返回一个数字——如果找到关键词,返回它在标题里的起始索引;如果没找到,返回-1。你把这个数字和x.title(字符串)做相等比较,两者类型和值都不可能匹配,所以不管输入什么,filteredProducts都会是空数组。
修复后的代码方案
基础版(区分大小写)
使用includes方法(ES6+,更直观)或者修正indexOf的判断逻辑:
// 方法1:用includes判断是否包含关键词 let filteredProducts = allProducts.filter(x => x.title.includes(userSearch)) // 方法2:用indexOf判断索引不等于-1 let filteredProducts = allProducts.filter(x => x.title.indexOf(userSearch) !== -1)
优化版(不区分大小写,用户体验更好)
用户输入可能是任意大小写,比如输入"chicken"和"Chicken"都应该匹配到对应的菜品,所以可以把标题和搜索词都转成小写再比较:
let lowerCaseSearch = userSearch.toLowerCase() let filteredProducts = allProducts.filter(x => x.title.toLowerCase().includes(lowerCaseSearch))
额外优化:处理空搜索
如果用户没输入任何内容,你可能希望返回所有产品,避免空数组:
let lowerCaseSearch = userSearch.trim().toLowerCase() let filteredProducts = lowerCaseSearch ? allProducts.filter(x => x.title.toLowerCase().includes(lowerCaseSearch)) : [...allProducts] // 返回所有产品的拷贝,避免原数组被意外修改
测试验证
比如你输入"chicken",现在filteredProducts会正确返回第一个产品;输入"cake",会返回第2、5个产品,完全符合预期。
内容的提问来源于stack exchange,提问作者LearningToProgram
相关产品推荐
相关产品推荐

