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

代码无法过滤数组问题排查:我的实现遗漏了什么?

问题排查与修复方案

嘿,我帮你找出了代码里的几个关键问题,咱们一步步来解决:

1. 过滤函数的语法错误

你在myFunc里的filter调用写法完全错了——isFiltered = searchItem => (item) => ...这种嵌套箭头函数的赋值逻辑根本不符合数组过滤的要求。我们只需要直接给filter传入一个判断函数,用全局的searchItem来匹配数组项的标题就行。

2. 输入变化后没触发重新渲染

你的onSearchChange只是更新了searchItem变量,但没调用myFunc()来重新计算过滤结果并更新页面,所以输入框敲完内容,页面完全没反应。

3. HTML标签未闭合

extractProps里最后一个<span>写成了<span>而不是</span>,这会导致HTML结构错乱,渲染出来的内容可能会出问题。


修正后的完整代码

HTML部分:

<form> 
  <input type="text" id="searchTerm" onChange="onSearchChange(this.value)" />
</form> 
<div id="root"></div>

JavaScript部分:

var searchItem = "";
const list = [
  {
    title: 'React',
    url: 'https://facebook.github.io/react/',
    author: 'Jordan Walke',
    num_comments: 3,
    points: 4,
    objectID: 0,
  },
  {
    title: 'Redux',
    url: 'https://github.com/reactjs/redux',
    author: 'Dan Abramov, Andrew Clark',
    num_comments: 2,
    points: 5,
    objectID: 1,
  },
];

// 输入变化时更新搜索词,并触发重新渲染
function onSearchChange(value) {
  searchItem = value;
  myFunc(); // 关键:每次输入都重新执行过滤和渲染
}

// 修复标签闭合,用模板字符串让代码更清晰
function extractProps(items) {
  return `<div>
            <span>${items.title}, </span>
            <span>${items.author}</span>
          </div>`;
}

function myFunc() {
  const root = document.getElementById('root');
  root.innerHTML = "";
  
  // 正确的过滤逻辑:忽略大小写匹配标题
  const filteredList = list.filter(item => 
    item.title.toLowerCase().includes(searchItem.toLowerCase())
  );
  
  // 把过滤后的数组转成HTML字符串并渲染
  const renderedHtml = filteredList.map(extractProps).join("");
  root.innerHTML = renderedHtml;
}

// 页面加载时先渲染初始列表
myFunc();

现在你输入关键词(比如"react"或者"redux"),页面就会实时过滤并显示匹配的项了。

内容的提问来源于stack exchange,提问作者Osama Sohail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:39