很多时候我们需要在不依赖 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]
console.log(flattenArray(nestedArr, 1)); // [1, 2, [3, [4, 5]], 6, 7]
这里需要留意几个细节:Array.isArray(item) 是判断是否为数组的核心条件;depth 参数控制扁平化深度,和 flat(depth) 的逻辑一致,默认 Infinity 表示完全扁平化;扩展运算符 ... 能把递归返回的子数组元素逐个推入结果数组,避免再次嵌套。

