数组的扁平化
请编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化 后的结果。
多维数组 是一种包含整数或其他 多维数组 的递归数据结构。
数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深度大于 n 时,才应该执行扁平化操作。第一层数组中元素的深度被认为是 0。
const arr = [1,2,3,[6],[7,8,[9,10,[1,2],11],12],[13,14,15]]
const flat = (arr, n) => { if (n <= 0) { return arr; } const result = []; for (let i = 0; i < arr.length; i++) { result.push(...(Array.isArray(arr[i]) ? flat(arr[i], n - 1) : [arr[i]])); } return result; };
BFS
可以利用concat的特性,循环次数为深度,但是some和展开concat都稍慢于广度优先的一层层拍平方案
const flat = function (arr, n) { while (n > 0 && arr.some(Array.isArray)) { arr = [].concat(...arr); n--; } return arr; };
DFS
广度优先的话需要每次都判断数组内是否还有嵌套数组,深度的话就是自己模拟栈即可,如果每一层栈都立刻处理,当前栈没有新增栈的话则弹出,稍快一点
const flat = function (arr, n = 0) { if (n <= 0) { return arr; } const result = []; const stack = []; // 栈变量,一层层存入 for (let i = 0; i < arr.length; i++) { const current = arr[i]; if (Array.isArray(current)) { stack.push(current); while (stack.length) { const last = stack[stack.length - 1]; // 获取当前最深的栈 let deeper = false; while (last.length) { const c = last.shift(); if (Array.isArray(c) && n > stack.length) { stack.push(c); // 增加栈深度 deeper = true; break; } else { result.push(c); } } if (!deeper) { // 如果本层拍平没有增加深度则弹出 stack.pop(); } } } else { result.push(current); } } return result; };