将数组拍平,第二个参数定义深度
两种方式:
- 广度优先
- 深度优先 两种方式在第二个参数为负值时表现不同,深度优先会在最外层多一维,主要是实现方式的差异导致的 此处的两种代码,深度优先性能更好,广度优先存在冗余操作
// 广度优先
function flatten_bfs(arr, depth = 1) {
let res = [...arr];
for (let i = 0; i < depth; i++) {
const queue = res;
res = [];
for (const item of queue) {
if (Array.isArray(item)) res.push(...item);
else res.push(item);
}
}
return res;
}
// 深度优先
function flatten_dfs(arr, depth = 1) {
const res = [];
const dfs = function(data, d) {
if (d > 0 && Array.isArray(data)) {
data.forEach(item => dfs(item, d - 1));
} else res.push(data);
};
dfs(arr, depth + 1);
return res;
}
const input = [1, [2, [3, 4], 5], 6, [7, 8]];
console.log(JSON.stringify(flatten_bfs(input, -1))); // [1,[2,[3,4],5],6,[7,8]]
console.log(JSON.stringify(flatten_dfs(input, -1))); // [[1,[2,[3,4],5],6,[7,8]]]