数组相关问题
数组扁平化
1. 使用 flat() 方法(推荐)
// 定义一个多维数组
const arr = [1, [2, [3, [4, 5]]], 6];
// 使用 flat() 并传入 Infinity 参数,无论多少层嵌套都能拍平
const result = arr.flat(Infinity);
console.log(result); // [1, 2, 3, 4, 5, 6]
flat():默认只展开一层(深度为 1)。flat(Infinity):展开任意深度的嵌套数组。
优点:代码极简,原生性能优化,支持空位处理。 缺点:IE 浏览器不支持(需要 Polyfill)。
🛠️ 备选通用方法(兼容性写法)
如果你的运行环境不支持 ES6 的 flat 方法,或者你需要更精细的控制,可以使用以下手写实现。
2. 递归 + reduce(经典手写)
这是面试中常考的写法,逻辑清晰,兼容性好。
function flatten(arr) {
return arr.reduce((prev, next) => {
// 如果 next 是数组,则递归展开;否则直接拼接
return prev.concat(Array.isArray(next) ? flatten(next) : next);
}, []);
}
// 测试
const arr = [1, [2, [3, [4, 5]]], 6];
console.log(flatten(arr)); // [1, 2, 3, 4, 5, 6]
3. 递归 + some 与 扩展运算符(循环降维)
利用 some 检测是否还存在数组项,循环展开直到没有嵌套。
function flatten(arr) {
// 只要数组中还包含数组,就继续展开
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}