JavaScript数组合并的7种高效方法详解
作者:编程随想▿
这篇文章主要介绍了在日常 JavaScript 开发中,数组操作是最常见的任务之一,其中数组合并更是高频需求,本文给大家介绍了JavaScript数组合并的7种高效方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
一、为什么需要数组合并?
在数据处理中,我们经常需要:
- 合并多个 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 < newNums.length; i++) { nums.push(newNums[i]); } // 使用 forEach newNums.forEach(num => 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 | 低 |
最佳实践建议:
- 现代项目:优先使用扩展运算符(
[...arr1, ...arr2]
) - 需要修改原数组:使用
arr1.push(...arr2)
- 深度嵌套数组:使用
flat(Infinity)
- 需要去重:结合
Set
和扩展运算符 - 超大型数组:使用循环分块处理
- 兼容旧浏览器:使用
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 种合并方法各有适用场景:
- 简单合并 → 扩展运算符
- 修改原数组 →
push(...arr)
- 深度嵌套 →
flat()
- 兼容性需求 →
concat()
或循环 - 高级处理 →
reduce()
- 合并去重 →
Set
+ 扩展运算符
扩展知识:
- 使用
Array.isArray()
验证输入确保安全合并 - 使用
lodash
的_.flattenDeep()
处理复杂嵌套 - 使用
flatMap()
实现合并+映射一步到位
以上就是JavaScript数组合并的7种高效方法详解的详细内容,更多关于JavaScript数组合并方法的资料请关注脚本之家其它相关文章!