扁平化:将多维数组变成一维数组,不存在数组的嵌套
// 1. ES6 flat
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr) => {
return arr.flat(Infinity);
}
flatten(array);
// 2. toString 转换成字符串,','切割
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr) => {
return arr.toString().split(',').map(item => Number(item))
}
flatten(array);
// 3. 转换成字符串用正则替换所有的[]
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr) => {
let str = JSON.stringify(arr).replace(/(\[|\])/g, '');
str = `[${str}]`;
return JSON.parse(str);
}
flatten(array);
// 4. 循环递归
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr = [], depth = 1) => {
const res = [];
(function flat(arr, depth) {
arr.forEach(item => {
if (Array.isArray(item) && depth > 0) {
flat(item, depth - 1)
} else {
res.push(item)
}
})
})(arr, depth)
return res;
}
flatten(array, Infinity);
// 5. 使用 reduce 函数
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr = [], depth = 1) => {
if (depth <= 0) return;
return arr.reduce((res, cur) =>
res.concat(Array.isArray(cur)
? flatten(cur, depth - 1) : depth), [])
}
flatten(array, Infinity);
// 6. 使用 generator 函数
const array = [1, [2, [3, [4, 5]]], 6];
function* flatten(arr) {
for (let item of arr) {
if (Array.isArray(item)) {
yield* flatten(item);
} else {
yield item;
}
}
}
console.log([...flatten(array)])
// 7. 使用堆栈 stack 避免递归,递归循环都可通过维护一个堆结构来解决
/**
* 思路:1) 把数组通过一个栈来维护
* 2) 当栈不为空的时候循环执行处理
* 3) pop() 将栈尾出栈
* 4) 如果出栈的元素是数组,就将该元素解构后每一个元素进行入栈操作
* 5) 出栈的元素不是数组就push到返回值res中
* 6) 反转恢复原数组的顺序
*/
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr) => {
const stack = [...arr];
const res = [];
while (stack.length) {
// 使用 pop 从 stack 中取出并移除值
const next = stack.pop();
if (Array.isArray(next)) {
// 使用 push 送回内层数组中的元素,不会改动原始输入
stack.push(...next);
} else {
res.push(next);
}
}
return res.reverse();
}
flatten(array)
// 8. some + while 循环
const array = [1, [2, [3, [4, 5]]], 6];
const flatten = (arr) => {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
flatten(array);