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

目录

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

二、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 < 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

 

最佳实践建议

  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() 实现合并+映射一步到位

 

你可能感兴趣的:(JavaScript,javascript,开发语言,ecmascript,前端)