0

0

React 中按状态分组数据的最优实践:一次遍历胜过多次过滤

聖光之護

聖光之護

发布时间:2026-03-10 10:01:20

|

227人浏览过

|

来源于php中文网

原创

在 React 前端需将汽车数组按 status(如 'new'/'purchased'/'damaged')分组渲染时,避免重复遍历是提升性能的关键;使用 Array.prototype.reduce() 配合 Map 仅需单次遍历即可完成三组数据构建,比多次 filter() 或嵌套 filter + map 更高效、更简洁。

react 前端需将汽车数组按 status(如 'new'/'purchased'/'damaged')分组渲染时,避免重复遍历是提升性能的关键;使用 `array.prototype.reduce()` 配合 `map` 仅需单次遍历即可完成三组数据构建,比多次 `filter()` 或嵌套 `filter + map` 更高效、更简洁。

当后端返回的是未分类的原始汽车数组(例如 [{id: 1, status: 'new'}, {id: 2, status: 'damaged'}, ...]),而 UI 需要为三种状态分别渲染独立 Tab 时,开发者常面临一个关键权衡:如何在保证可维护性的同时,最小化计算开销?

你最初采用的方案——对同一数组三次调用 .filter().map()——看似直观,实则隐含性能损耗:

const newCars = useMemo(() => cars.filter(c => c.status === 'new').map(c => ({ id: c.id })), [cars]);
const purchasedCars = useMemo(() => cars.filter(c => c.status === 'purchased').map(c => ({ id: c.id })), [cars]);
const damagedCars = useMemo(() => cars.filter(c => c.status === 'damaged').map(c => ({ id: c.id })), [cars]);

该写法会遍历 cars 数组共 3 次,时间复杂度为 O(3n) ≈ O(n),虽属线性,但常数因子显著增大,尤其在 cars 规模达数百或上千项时,可测得明显延迟(尤其在低功耗设备或频繁更新场景下)。

而你尝试的 Map 方案虽结构更集中,但核心逻辑仍为:

Monica Search
Monica Search

Monica推出的AI搜索引擎

下载
statuses.forEach(status => 
  cars.filter(car => car.status === status) // ❌ 每次都重遍历整个 cars
);

仍未解决重复遍历问题,性能与第一种方案实质等价。

✅ 正确解法:单次遍历 + 分流聚合
利用 Array.prototype.reduce() 在一次迭代中完成状态分组,配合 Map 存储结果。它将时间复杂度严格控制在 O(n)(常数因子为 1),且语义清晰、扩展性强:

const carsByStatus = useMemo(() => {
  return cars.reduce((map, car) => {
    const { status } = car;
    const list = map.get(status) ?? [];
    list.push({
      id: car.id,
      // ✅ 按需映射其他字段,避免冗余属性
      name: car.name,
      year: car.year,
    });
    return map.set(status, list);
  }, new Map<string, Array<{ id: number; name: string; year: number }>>());
}, [cars]);

使用时直接取值渲染:

// 新车 Tab
{carsByStatus.get('new')?.map((car, idx) => (
  <CarItem key={car.id} car={car} />
))}

// 已购 Tab
{carsByStatus.get('purchased')?.map((car, idx) => (
  <CarItem key={car.id} car={car} />
))}

⚠️ 注意事项:

  • key 推荐用唯一 ID 而非 index:map() 中若用 index 作 key,当列表顺序变化(如排序、增删)时易触发错误 DOM 复用,应始终优先使用稳定标识符(如 car.id);
  • Map 的默认值处理:get(status) 可能返回 undefined,务必通过可选链 ?. 或空值合并 ?? [] 安全访问;
  • 类型安全增强:TypeScript 下可定义精确的 Map 类型(如 Map),配合 as const 断言实现编译期状态校验;
  • 是否预设所有状态? 若业务要求三个 Tab 始终存在(即使某状态无数据),可在 reduce 前初始化 Map:new Map([['new',[]],['purchased',[]],['damaged',[]]])。

? 总结:
在数据分组场景中,“一次遍历”是性能优化的黄金准则。reduce + Map 不仅击败多次 filter 的运行效率,还提升了代码内聚性——逻辑集中、状态明确、易于单元测试。相比“为每个 Tab 单独计算”,它天然支持动态状态扩展(如未来新增 'reserved' 状态,仅需追加枚举值,无需新增 useMemo 块)。真正的 clean code,始于对数据流动本质的理解。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

45

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

189

2026.02.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

321

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

292

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

177

2025.08.07

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

561

2023.09.20

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号