js 数组合并(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 JavaScript 开发中,数组合并是一项基础且高频的操作。无论是处理用户数据、合并配置项,还是整合多个 API 响应,开发者都需要灵活运用数组合并的方法。对于编程初学者而言,理解数组合并的底层逻辑和不同场景的适用性至关重要;而中级开发者则可以通过深入探索高级技巧,提升代码的优雅度和性能。本文将以“js 数组合并”为核心,通过循序渐进的方式,从基础概念到实战案例,全面解析这一主题。


数组合并的基础概念

什么是数组合并?

数组合并(Array Merging)是指将两个或多个数组中的元素整合到一个新数组中的操作。例如,将 [1, 2][3, 4] 合并为 [1, 2, 3, 4]。在 JavaScript 中,数组合并可以通过多种方法实现,每种方法都有其特点和适用场景。

合并的核心逻辑:元素追加与去重

合并数组的核心逻辑可以分为两部分:

  1. 元素追加:将一个数组的元素依次添加到另一个数组的末尾。
  2. 去重处理:在合并时,可能需要排除重复的元素(例如合并两个购物车列表时,避免重复商品)。

形象比喻
可以将数组合并想象为整理乐高积木的过程。每个数组是一个装有不同颜色积木的盒子,合并操作就是将多个盒子中的积木全部倒入一个大盒子里。如果希望避免重复,就需要检查每一块积木是否已存在。


常用方法详解

方法一:concat() 方法

concat() 是 JavaScript 数组的原生方法,用于合并两个或多个数组。它返回一个新数组,而不修改原数组。

基础用法

const arr1 = [1, 2];  
const arr2 = [3, 4];  
const mergedArray = arr1.concat(arr2);  
console.log(mergedArray); // 输出:[1, 2, 3, 4]  

扩展:合并多个数组

concat() 支持传入多个数组作为参数:

const arr3 = [5, 6];  
const mergedArray = arr1.concat(arr2, arr3);  
// 输出:[1, 2, 3, 4, 5, 6]  

注意事项

  • 不改变原数组concat() 总是返回新数组,原数组保持不变。
  • 嵌套数组处理:如果参数是数组,则其元素会被展开;如果是非数组参数(如数字或字符串),则直接追加。例如:
    const result = [0].concat(5, [6, 7]); // 输出:[0, 5, 6, 7]  
    

方法二:扩展运算符(Spread Operator)

扩展运算符 ... 是 ES6 引入的语法糖,可以更简洁地实现数组合并。

基础用法

const mergedArray = [...arr1, ...arr2];  
console.log(mergedArray); // 输出:[1, 2, 3, 4]  

优势对比

方法语法复杂度可读性多数组支持
concat()较高中等支持
扩展运算符支持

扩展运算符的语法更直观,尤其适合合并多个数组:

const mergedArray = [...arr1, ...arr2, ...arr3];  

深入理解:底层原理

扩展运算符在合并数组时,会遍历目标数组的元素并逐个复制到新数组中。这一过程与 concat() 类似,但语法更简洁。


方法三:push() 方法与 apply() 结合

push() 方法可以向数组末尾添加元素,但直接合并数组时需要借助 apply()

const mergedArray = arr1.slice(); // 复制原数组避免修改  
Array.prototype.push.apply(mergedArray, arr2);  
console.log(mergedArray); // 输出:[1, 2, 3, 4]  

注意事项

  • 修改原数组:如果直接使用 arr1.push(),原数组会被修改。
  • 兼容性apply() 在 ES6 之后仍可用,但代码可读性较低,建议优先使用 concat() 或扩展运算符。

方法四:reduce() 方法

reduce() 是一个高阶函数,通过迭代数组生成最终结果。利用它可以灵活合并数组:

const mergedArray = [arr1, arr2].reduce((acc, curr) => acc.concat(curr), []);  
console.log(mergedArray); // 输出:[1, 2, 3, 4]  

场景优势

当需要合并一个数组列表(例如 [[1], [2], [3]])时,reduce() 非常实用:

const arrayOfArrays = [[1], [2], [3]];  
const merged = arrayOfArrays.reduce((acc, curr) => acc.concat(curr), []);  
// 输出:[1, 2, 3]  

合并时的去重处理

使用 Set 实现去重

如果合并后的数组需要排除重复元素,可以借助 Set 数据结构:

const mergedArray = [...new Set([...arr1, ...arr2])];  
// 输出:合并后的数组,且元素唯一  

注意事项

  • Set 会自动去重,但会保留首次出现的元素。
  • 对于复杂对象(如对象或自定义类的实例),需自定义去重逻辑(例如通过唯一标识符)。

手动去重函数

如果需要更精细的控制,可以编写自定义函数:

function mergeUnique(arr1, arr2) {  
  const merged = [...arr1, ...arr2];  
  const unique = [];  
  merged.forEach(item => {  
    if (!unique.includes(item)) {  
      unique.push(item);  
    }  
  });  
  return unique;  
}  

实战案例与代码示例

案例一:合并购物车列表

假设用户有两个购物车数组,需要合并并去重:

const cart1 = ["apple", "banana", "orange"];  
const cart2 = ["banana", "grape", "kiwi"];  

const mergedCart = [...new Set([...cart1, ...cart2])];  
console.log(mergedCart); // 输出:["apple", "banana", "orange", "grape", "kiwi"]  

案例二:合并 API 响应数据

当从多个 API 端点获取分页数据时,合并数组并排序:

const page1 = [{ id: 1 }, { id: 2 }];  
const page2 = [{ id: 3 }, { id: 4 }];  

const allItems = [...page1, ...page2].sort((a, b) => a.id - b.id);  

案例三:处理表单多选字段

在表单提交时,合并多个多选框的选中值:

const selectedColors = ["red", "blue"];  
const selectedSizes = ["S", "M"];  

const formData = {  
  selections: [...selectedColors, ...selectedSizes]  
};  

性能与选择建议

性能对比

方法时间复杂度适用场景
concat()O(n)合并少量数组时简洁高效
扩展运算符O(n)现代代码中首选,语法简洁
reduce()O(n²)合并嵌套数组或复杂结构
push() + apply()O(n)需要直接修改原数组时

选择建议

  • 简单合并:优先使用扩展运算符([...arr1, ...arr2])。
  • 需要去重:结合 Set 或自定义函数。
  • 复杂场景:例如合并嵌套数组或对象时,使用 reduce() 并编写自定义逻辑。

结论

js 数组合并是 JavaScript 开发中的核心技能之一,掌握其方法和逻辑可以帮助开发者高效处理数据整合任务。从基础的 concat() 到现代的扩展运算符,再到 reduce() 的灵活应用,每种方法都有其适用场景。对于初学者,建议从扩展运算符和 concat() 入手,逐步理解数组操作的底层原理;中级开发者则可以通过结合 Setreduce(),解决更复杂的合并需求。

通过本文的讲解和案例,希望读者能够:

  1. 理解数组合并的底层逻辑和核心操作。
  2. 掌握至少三种合并数组的方法,并根据场景选择最优方案。
  3. 在实际项目中灵活应用去重和性能优化技巧。

未来在开发中遇到数组合并的场景时,不妨先问自己:

  • 需要保留原数组吗?
  • 是否需要去重?
  • 是否需要处理复杂数据类型?

带着这些问题选择合适的方法,你的代码将更加优雅和高效。

最新发布