> 技术文档 > JavaScript 数组合并全攻略:7种高效方法详解_js数组合并

JavaScript 数组合并全攻略:7种高效方法详解_js数组合并

目录

一、为什么需要数组合并?

二、7 种数组合并方法详解

1. concat() - 经典合并方法

2. 扩展运算符(ES6 首选) 

3. push() + 扩展运算符 - 动态添加元素 

4. reduce() - 函数式编程利器 

5. flat() - 嵌套数组克星(ES2019) 

6. 手动循环 - 最基础方法 

7. Array.from() + Set - 合并去重 

三、性能对比与最佳实践

性能测试结果(合并 10000 个元素的数组 x 1000 次)

四、实战应用场景

场景 1:合并 API 分页数据

 场景 2:表单多组输入合并

场景 3:递归合并嵌套配置 

五、总结与扩展知识


一、为什么需要数组合并?

在数据处理中,我们经常需要:

  • 合并多个 API 返回的数据集

  • 组合不同来源的用户输入

  • 扁平化嵌套数据结构

  • 汇总计算结果

掌握高效合并方法能大幅提升代码质量和性能!

二、7 种数组合并方法详解

1. concat() - 经典合并方法

const arr1 = [1, 2];const arr2 = [3, 4];const arr3 = [5, 6];// 合并两个数组const merged = arr1.concat(arr2); // [1, 2, 3, 4]// 合并多个数组const allMerged = arr1.concat(arr2, arr3);// [1, 2, 3, 4, 5, 6]

特点

  • ✅ 不改变原数组

  • ✅ 可合并多个数组

  • ❌ 不支持深层次嵌套数组的扁平化

 

2. 扩展运算符(ES6 首选) 

const fruits = [\'🍎\', \'🍌\'];const veggies = [\'🥦\', \'🥕\'];const sweets = [\'🍰\', \'🍫\'];// 基础合并const healthyFood = [...fruits, ...veggies];// [\'🍎\', \'🍌\', \'🥦\', \'🥕\']// 多数组合并const allFood = [...fruits, ...veggies, ...sweets];// [\'🍎\', \'🍌\', \'🥦\', \'🥕\', \'🍰\', \'🍫\']// 插入元素const withIceCream = [...fruits, \'🍦\', ...sweets];// [\'🍎\', \'🍌\', \'🍦\', \'🍰\', \'🍫\']

特点

  • ✅ 语法简洁直观

  • ✅ 灵活插入额外元素

  • ✅ 现代 JS 开发首选方式

  • ❌ 旧浏览器需要 polyfill

 

3. push() + 扩展运算符 - 动态添加元素 

const cart = [\'📱\', \'💻\'];const newItems = [\'🎧\', \'⌚\'];// 合并到现有数组(改变原数组)cart.push(...newItems);console.log(cart); // [\'📱\', \'💻\', \'🎧\', \'⌚\']

特点

  • ✅ 直接修改原数组

  • ✅ 高效添加多个元素

  • ❌ 无法处理超大数组(可能栈溢出)

 

4. reduce() - 函数式编程利器 

const arrays = [[1, 2], [3, 4], [5, 6]];const flattened = arrays.reduce((acc, current) => { return acc.concat(current);}, []);console.log(flattened); // [1, 2, 3, 4, 5, 6]

高级用法 - 条件合并

const data = [ [1, 2], null, [5, 6], undefined, [7, 8]];const cleanMerge = data.reduce((acc, curr) => { return curr ? [...acc, ...curr] : acc;}, []);console.log(cleanMerge); // [1, 2, 5, 6, 7, 8]

特点

  • ✅ 处理复杂合并逻辑

  • ✅ 过滤无效数据

  • ❌ 性能不如原生方法

 

5. flat() - 嵌套数组克星(ES2019) 

const nestedArray = [1, [2, 3], [4, [5, 6]]];// 默认展开一层console.log(nestedArray.flat()); // [1, 2, 3, 4, [5, 6]]// 展开所有层级console.log(nestedArray.flat(Infinity)); // [1, 2, 3, 4, 5, 6]

特点

  • ✅ 专为嵌套数组设计

  • ✅ 可控制展开深度

  • ❌ 不兼容 IE 和旧移动浏览器

 

6. 手动循环 - 最基础方法 

const nums = [10, 20];const newNums = [30, 40];// 使用 for 循环for (let i = 0; i  nums.push(num));console.log(nums); // [10, 20, 30, 40]

特点

  • ✅ 最高兼容性

  • ✅ 完全控制合并过程

  • ❌ 代码冗长

 

7. Array.from() + Set - 合并去重 

const dupArr1 = [1, 2, 3];const dupArr2 = [2, 3, 4];// 合并并去重const uniqueMerge = Array.from( new Set([...dupArr1, ...dupArr2]));console.log(uniqueMerge); // [1, 2, 3, 4]

特点

  • ✅ 自动去重

  • ✅ 简洁高效

  • ❌ 无法自定义去重逻辑

 

三、性能对比与最佳实践

性能测试结果(合并 10000 个元素的数组 x 1000 次)

方法 耗时(ms) 内存占用 concat() 120 低 扩展运算符 125 低 push + 扩展运算符 110 最低 reduce() 350 高 flat() 200 中 手动循环 130 低

 

最佳实践建议

  1. 现代项目:优先使用扩展运算符([...arr1, ...arr2]

  2. 需要修改原数组:使用 arr1.push(...arr2)

  3. 深度嵌套数组:使用 flat(Infinity)

  4. 需要去重:结合 Set 和扩展运算符

  5. 超大型数组:使用循环分块处理

  6. 兼容旧浏览器:使用 concat() 或手动循环

 

四、实战应用场景

场景 1:合并 API 分页数据

async function fetchAllPages() { let allData = []; let page = 1; while (true) { const response = await fetch(`/api/data?page=${page}`); const data = await response.json(); if (data.length === 0) break; allData = [...allData, ...data]; page++; } return allData;}

 场景 2:表单多组输入合并

function getFormData() { const personalInfo = [\'name\', \'email\']; const preferences = [\'theme\', \'language\']; const security = [\'password\', \'2fa\']; return { fields: [...personalInfo, ...preferences, ...security], // ES2020 可选链操作符 timestamp: new Date().toISOString() };}

 

场景 3:递归合并嵌套配置 

function mergeConfigs(defaults, custom) { return { ...defaults, ...custom, nestedOptions: { ...defaults.nestedOptions, ...custom.nestedOptions } };}

五、总结与扩展知识

掌握数组操作是 JavaScript 开发的核心能力,本文涵盖的 7 种合并方法各有适用场景:

  1. 简单合并 → 扩展运算符

  2. 修改原数组 → push(...arr)

  3. 深度嵌套 → flat()

  4. 兼容性需求 → concat() 或循环

  5. 高级处理 → reduce()

  6. 合并去重 → Set + 扩展运算符

扩展知识

  • 使用 Array.isArray() 验证输入确保安全合并

  • 使用 lodash 的 _.flattenDeep() 处理复杂嵌套

  • 使用 flatMap() 实现合并+映射一步到位