flat js实现
在JavaScript中实现扁平化(flatten)数组操作,可以通过多种方法将多维数组转换为一维数组。以下是几种常见实现方式:
使用递归方法
递归遍历数组,逐层展开嵌套元素:
function flattenDeep(arr) {
return arr.reduce((acc, val) =>
Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val),
[]);
}
// 使用示例
flattenDeep([1, [2, [3, [4]], 5]]); // 返回 [1, 2, 3, 4, 5]
使用ES6的flat方法
现代JavaScript原生支持数组扁平化:
const nestedArray = [1, [2, [3, [4]], 5]];
// 默认展开一层
nestedArray.flat(); // 返回 [1, 2, [3, [4]], 5]
// 无限层级展开
nestedArray.flat(Infinity); // 返回 [1, 2, 3, 4, 5]
使用迭代方法
通过循环实现非递归版本的扁平化:
function flattenIterative(arr) {
const stack = [...arr];
const result = [];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.push(next);
}
}
return result.reverse();
}
性能优化版本
对于大型数组,可优化递归调用:
function flattenFast(arr) {
const flattened = [];
(function flat(arr) {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) flat(arr[i]);
else flattened.push(arr[i]);
}
})(arr);
return flattened;
}
处理稀疏数组
保留原始数组的空位:
function flattenSparse(arr) {
return arr.flatMap(item =>
Array.isArray(item) ? flattenSparse(item) : item
);
}
选择方法时应考虑:

- 现代环境优先使用原生
flat() - 递归方法代码简洁但可能有堆栈限制
- 迭代方法适合处理深层嵌套结构
- 性能敏感场景建议基准测试不同实现
所有方法都遵循JavaScript的数组操作规范,保持元素原始顺序。特殊场景如包含非数组对象或循环引用需要额外处理。






