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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:57:42