扁平化数组
tip
考察ES6的熟悉程度,对迭代法和递归法的熟悉程度
一、使用reduce方法进行扁平化
使用递归的方式,对数组中的每个元素进行逐个检查,如果不是普通数字,则深入递归,展开
function flattenDeep(arr){
return Array.isArray(arr) ? arr.reduce((acc, current) =>{
return [...acc, ...flattenDeep(current)]
},[]) : [arr];
}
二、模拟栈
利用栈,对多维的数组,进行逐个展开,并将平展后的数组压入栈中。
需要注意的点:
保持取出顺序
从栈的顶部进行逐个取值,当取到的值是多维数组,则再平展一层后,重新入栈的还原
取出的结果,因为是倒序的,所以在存入result时,要还原回来(使用unshift
)
function flattenDeep(arr){
const stack = [...arr]; // 先平展复制到stack
const result = [];
while(stack.length){
// 取出末尾的值
const current = stack.pop();
if(Array.isArray(current)){
// 如果值是数组,平展后,重新推入stack
stack.push(...current);
}else{
// 末尾是普通值,则存入result
result.unshift(current);
}
}
return result;
}