如何通过影片名称而非ID筛选items2列表数据?
解决方案:通过影片名称筛选关联数据
问题核心
需要基于items1中的movieName关键词,筛选出items2里关联的对应数据。当前存在两个关键问题:
items2中的电影ID字段大小写不统一(MovieId/movieId)- 之前尝试的代码存在变量名错误、逻辑偏差(比如用
map导致返回undefined,未正确关联两个数组的ID)
优化实现方案
方案1:高效映射版(推荐)
先把items1转换成ID与名称的映射表,避免反复遍历数组,提升搜索效率:
useEffect(() => { if (keyword) { const lowerKeyword = keyword.toLowerCase(); // 先筛选出名称匹配的电影ID列表 const matchedMovieIds = items1 .filter(movie => movie.movieName.toLowerCase().includes(lowerKeyword)) .map(movie => movie._id); // 筛选items2中关联的项,兼容大小写不同的ID字段 const result = items2.filter(item => { const itemMovieId = item.MovieId || item.movieId; return matchedMovieIds.includes(itemMovieId); }); setData(result); } else { setData(items2); } }, [keyword, items1, items2]);
方案2:复用现有search函数版
如果想保留已有的search函数,可以按以下方式修改:
useEffect(() => { if (keyword) { // 用现有search函数找出名称匹配的电影 const matchedMovies = search(items1, keyword, ["movieName"]); // 提取这些电影的ID集合 const matchedIds = matchedMovies.map(m => m._id); // 筛选items2中符合条件的项,兼容ID字段大小写 const result = items2.filter(item => { const id = item.MovieId || item.movieId; return matchedIds.includes(id); }); setData(result); } else { setData(items2); } }, [keyword, items1, items2]);
你之前代码的错误点
- 变量名错误:
item1应为items1,items._id应为movie._id - 方法误用:
map会遍历所有items2元素并返回结果,不匹配的项会返回undefined,应该用filter筛选符合条件的项 - 作用域错误:
setData(x)中的x是map内部变量,外部无法访问
内容的提问来源于stack exchange,提问作者Frank HAWK
相关产品推荐
相关产品推荐

