一、题目要求
输入:
const arr = [1, [2, 3], [4, [5, 6, [7, 8]]]];
输出:
const result = flattern(arr);
// [1, 2, 3, 4, 5, 6, 7, 8];
要求实现flattern方法。
二、实现
方法一:递归法
首先能想到的就是以递归的方式处理。
function flattern(arr) {
let result = [];
arr.forEach(item=>{
if (Array.isArray(item)) {
result = result.concat(arrayFlattern(item));
} else {
result.push(item);
}
});
return result;
}
方法二:reduce法
处理数组并且返回值也是一个数组,一般可以通过数组是reduce方法来处理,reduce属于函数式编程的范畴,代码可读性很高。
function flattern(arr) {
return arr.reduce((prev, cur) => {
return prev.concat(Array.isArray(cur) ? flattern(cur) : cur);
}, []);
}
方法三:stack法
也可以借助一个堆栈的数据结构用于存储数组,然后使用while循环来遍历这个栈结构,在循环内从头部取出一个元素进行判断当前元素是否为数组类型,如果是数组则利用展开运算符可以打平一层数组的特性,将打平的数组放到stack中,如果不是数组类型则push到结果数组中。直到stack中没有元素为止。
function flattern(arr) {
const stack = [...arr];
let res = [];
while (stack.length) {
const next = stack.shift();
if (Array.isArray(next)) {
stack.push(...next);
} else {
res.push(next);
}
}
return res;
}
测试代码
测试一下
function test() {
const arr = [1, [2, 3], [4, [5, 6, [7, 8]]]];
// const res = flattern(arr);
//const res = flattern1(arr);
const res = flattern2(arr);
console.log(res);
}
test();