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

根据输入值过滤数据时遇forEach报错及[object Object]问题求助

问题原因及解决方法

核心错误1:beersArray被转成了字符串

你在map之后调用了.join(""),这会把map返回的对象数组直接转换成字符串——因为数组里的每个对象会被默认转为[object Object],拼接后beersArray就变成了一串[object Object][object Object]...的字符串,而不是数组。字符串没有forEach方法,所以报错;用Array.from()处理字符串时,会把每个字符拆成数组元素,自然不符合预期。

核心错误2:缺少DOM元素引用,且判断逻辑错误

就算去掉.join(""),你返回的对象只有name属性,没有对应的DOM元素引用,后续beer.element会报错;另外beer.includes(value)也不对,对象没有includes方法,应该检查beer.name是否包含输入值。


修正后的代码

1. 修改displayAllBeers函数

不再用字符串拼接累加innerHTML,而是创建真实DOM元素并保存引用:

let beersArray = [];

function displayAllBeers(data) {
  // 先清空容器,避免重复渲染
  beersContainer.innerHTML = '';
  
  beersArray = data.map((beer) => {
    // 创建单个啤酒容器元素
    const beerContainer = document.createElement('div');
    beerContainer.className = 'beerContainer';
    // 填充内容
    beerContainer.innerHTML = `
      <h3 class='name'>${beer.name}</h3>
      <img src='${beer.image_url}' alt='${beer.name}'>
      <p>${beer.description}</p>
      <button class="addFavBtn">Favourite</button>
    `;
    // 添加到页面容器
    beersContainer.appendChild(beerContainer);
    // 返回包含名称和DOM元素的对象
    return { name: beer.name, element: beerContainer };
  });
}

2. 修改搜索事件监听

修正判断逻辑,同时忽略大小写让搜索更友好:

searchInput.addEventListener("input", (e) => {
  const value = e.target.value.trim().toLowerCase();
  beersArray.forEach((beer) => {
    // 检查啤酒名称是否包含输入值(忽略大小写)
    const isVisible = beer.name.toLowerCase().includes(value);
    // 切换隐藏类
    beer.element.classList.toggle("hide", !isVisible);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:01:14