2023-09-05 23:22:39
JavaScript数组扁平化可通过原生flat()方法、递归reduce或迭代栈法实现,核心是消除嵌套层级,将多维数组转为一维数组。 以下是具体方法及注意事项:
一、核心实现方法原生flat()方法
语法:arr.flat([depth]),depth为扁平化深度(默认1),传入Infinity可完全扁平化。
示例:
const nestedArray = [1, [2, 3], [4, [5, 6]]];const flatOnce = nestedArray.flat(); // [1, 2, 3, 4, [5, 6]]const flatAll = nestedArray.flat(Infinity); // [1, 2, 3, 4, 5, 6]优势:语法简洁,底层优化,性能最佳,兼容现代浏览器和Node.js。
递归reduce实现
原理:通过reduce遍历数组,递归处理子数组,用concat或展开运算符拼接结果。
示例:
function customFlatten(arr) { return arr.reduce((acc, val) => { return acc.concat(Array.isArray(val) ? customFlatten(val) : val); }, []);}const flattened = customFlatten(nestedArray); // [1, 2, 3, 4, 5, 6]适用场景:嵌套层级不深,追求代码简洁性,但需注意堆栈溢出风险。
迭代栈法
原理:用栈模拟递归,避免深层调用导致的堆栈溢出,适合处理极深嵌套。
示例:
function flattenWithStack(arr) { const stack = [...arr]; const result = []; while (stack.length > 0) { const element = stack.pop(); if (Array.isArray(element)) { for (let i = element.length - 1; i >= 0; i--) { stack.push(element[i]); } } else { result.push(element); } } return result.reverse(); // 反转结果以保持顺序}const flattenedIterative = flattenWithStack(nestedArray); // [1, 2, 3, 4, 5, 6]优势:无递归限制,适合不可控的深层嵌套数据。
通过合理选择方法并注意边界条件,可高效实现JavaScript数组扁平化,满足不同场景需求。