
本文介绍如何将低效的多数组合并去重函数,重构为高性能、内存友好、支持任意数量数组的一行式解决方案,核心利用 rest 参数、flat() 和 Set 去重。
本文介绍如何将低效的多数组合并去重函数,重构为高性能、内存友好、支持任意数量数组的一行式解决方案,核心利用 rest 参数、`flat()` 和 `set` 去重。
在实际开发中,频繁合并多个数组并确保元素唯一性是常见需求。原始实现使用固定五个参数、嵌套循环 + indexOf() 判重,时间复杂度高达 O(n²),且每次查找都遍历整个结果数组,内存与性能双重低效。
优化的关键在于三点:参数灵活性、扁平化效率、去重机制升级。
首先,用 rest 参数 (...arrs) 替代硬编码的五个形参,使函数天然支持任意数量的输入数组:
<code class="javascript">const merge = (...arrs) => [...new Set(arrs.flat())];</code>
-
arrs是一个包含所有传入数组的类数组(实际为真数组),例如merge(x, y, z)→arrs = [x, y, z]; -
arrs.flat()将二维结构(数组的数组)一次性展平为一维数组,比手动for循环拼接更简洁、底层更优化; -
new Set(...)利用Set数据结构的天然唯一性,在 O(n) 时间内完成去重; -
[...set]通过扩展运算符快速转回数组,避免Array.from()等额外开销。
✅ 对比原始版本:
- 时间复杂度:从 O(n²) 降至 O(n)(n 为所有数组总元素数);
- 空间复杂度:消除中间冗余数组和重复遍历,仅需一次展平 + 一次 Set 构建;
- 可读性与可维护性:代码精简至一行,语义清晰,无副作用。
⚠️ 注意事项:
-
flat()默认仅展开一层,适用于本例(输入均为一维数组)。若需处理深层嵌套,可传入深度参数如.flat(2); -
Set去重基于SameValueZero比较(即===规则),对NaN、对象引用等有特定行为——若需深比较或自定义去重逻辑,需另行实现; - 此方案不保证原始顺序的“首次出现优先”——但
Set构造时按插入顺序保留元素,而flat()遍历arrs顺序与调用时一致,因此最终结果仍保持各数组内元素的原始相对顺序(即x[0],x[1], ...,y[0],y[1], ... 中首次出现者保留)。
总结:一次重构融合现代 JavaScript 特性,不仅解决性能瓶颈,更提升了函数的通用性、健壮性与表达力。推荐在项目中直接采用该模式替代手写循环去重逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











