跳到主要内容

数组相关问题

数组扁平化

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;
}