核心是优先用 Set 或 Map 实现 O(1) 查找,遍历按语义选 for、for...of、map/filter;大数据量需预处理建索引,避免滥用数组导致性能损耗。

核心在于:用对数据结构,让查找从 O(n) 降到 O(1),遍历按需选型,不盲目套用高阶函数。
查找操作优先用 Set 或 Map
当目标是“判断是否存在”或“根据键取值”,数组的 includes、indexOf、find 都是线性扫描,数据量一过千,性能就明显下滑。
- 用
Set存原始值(如 ID、状态码、用户名):构建一次new Set(arr),后续set.has(x)稳定在常数时间 - 用
Map存对象映射(如{id: userObj}):支持任意类型键,map.get(key)同样是 O(1),且保留插入顺序 - 避免用普通对象模拟映射:对象键会强制转为字符串,丢失数字/符号/对象键的语义;Map 则无此限制
遍历场景要区分语义和开销
不是所有“循环”都一样。选错方式,既影响可读性,也拖慢执行。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 纯读取或简单计算(如求和、找最大值):优先用
for循环,缓存length,引擎优化最充分 - 需要中断(如找到即停):只能用
for或for...of,forEach和filter无法break - 生成新数组且逻辑清晰:
map/filter更安全、更易维护,但注意它们会创建新数组,内存有代价 - 遍历类数组或 DOM 集合:用
for...of最自然;forEach在 NodeList 上不可直接调用(需先转数组)
大数据量下预处理比实时计算更划算
如果同一组数据被反复查询(比如权限校验、选项匹配、树节点查找),不要每次都在数组里扫一遍。
立即学习“Java免费学习笔记(深入)”;
- 把“构建索引”作为初始化步骤:例如用户列表加载后,立刻生成
adminIdSet = new Set(admins.map(u => u.id)) - 对树形结构,用 Map 缓存节点引用:
nodeMap.set(node.id, node),避免递归遍历找父/子 - 注意权衡:预处理耗时 O(n),但换来后续 N 次 O(1) 查询——只要查询次数 ≥ 2~3 次,基本就回本
数组本身也有使用边界
数组不是万能容器。滥用会导致隐性性能损耗。
- 避免稀疏数组:用
new Array(10000)创建后不 fill,再 map/filter 会跳过空槽,行为难预测 - 头部插入删除(
unshift/shift)尽量不用:时间复杂度 O(n),改用push/pop或换用其他结构 - 查找前先问一句:这个操作真的必须在数组上做吗?能不能提前转成 Set/Map?


















