在处理嵌套数据时,我们常需要把多维数组拍平。虽然 ES6 提供了 flat() 方法,但有时为了兼容性或学习原理,我们需要手写实现。核心思路很简单:遍历元素,遇到数组就继续拆解,直到只剩非数组项。下面分享三种常见写法。
方法一:递归实现(逻辑最直观)
递归的核心在于'自调用'。遍历数组的每一个元素,如果当前元素是数组,就再次调用函数处理它;如果不是,直接加入结果集。
// 递归实现数组扁平化(可指定扁平化深度,默认完全扁平化)
function flattenArray(arr, depth = Infinity) {
// 存储最终扁平化结果
const result = [];
// 遍历原数组的每一个元素
arr.forEach(item => {
// 判断:如果当前元素是数组,且还没达到指定扁平化深度
if (Array.isArray(item) && depth > 0) {
// 递归处理子数组,深度减 1
result.push(...flattenArray(item, depth - 1));
} else {
// 非数组元素直接加入结果
result.push(item);
}
});
return result;
}
// 测试用例
const nestedArr = [1, [2, [3, [4, 5]], 6], 7];
// 完全扁平化
console.log(flattenArray(nestedArr)); // [1, 2, 3, 4, 5, 6, 7]
// 只扁平化 1 层
console.log(flattenArray(nestedArr, 1)); // [1, 2, [3, [4, 5]], 6, 7]

