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

React JS如何获取过滤后数组长度 实现筛选卡片结果动态计数

问题原因

你当前代码直接读取原始数组cards的长度展示结果数,但是Array.filter()不会修改原数组,只会返回匹配筛选规则的新数组。你没有保存这个筛选后的新数组,所以计数永远是原始数组的总长度,无法随搜索条件动态更新。
另外现有代码存在一处隐性bug:map遍历的第二个参数index是数字类型的数组下标,不存在id属性,用index.id作为组件key会触发React渲染警告,甚至导致列表渲染异常。

修复方法

把筛选逻辑抽离,将筛选后的结果存为独立变量,结果计数、列表渲染都复用这个筛选后的数组即可,每次搜索词或原始卡片数据变化时,筛选结果会自动重新计算,计数也会同步更新。
基础实现代码:

// 提前计算筛选后的卡片数组
const filteredCards = cards.filter(card => {
  return card.title.toLowerCase().includes(search.toLowerCase())
})

// 渲染部分
<div>
  <div>{filteredCards.length} Results</div>
  {
    filteredCards.map((card) => {
      // 请使用卡片自身的唯一标识作为key,不要用index.id
      return <CardJob 
        key={card.id}
        // 此处补全你原本需要传给CardJob组件的其他属性
      />
    })
  }
</div>

如果你的卡片数据量很大,筛选逻辑比较复杂,可以用useMemo缓存筛选结果,避免组件每次渲染都重复执行遍历筛选,优化性能:

import { useMemo } from 'react'

// 函数组件内部
const filteredCards = useMemo(() => {
  return cards.filter(card => {
    return card.title.toLowerCase().includes(search.toLowerCase())
  })
}, [cards, search]) // 仅当原始卡片数据、搜索关键词变化时,才重新执行筛选

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:01:13