今天在做嵌套数组扁平化(数组拍平),题目中要求通过参数n来控制扁平化的深度。 三个注意点:
- 数组扁平化代码中需要注意的细节:每次递归调用时要保持独立,不能影响外层参数.
- 递归调用时要记得更新这次调用的结果到要返回的结果中.
- 效率问题:拓展运算符比concat效率高.
function flat(arr, n){
let sum = [];
for(let i = 0; i < arr.length; i++){
if(Array.isArray(arr[i]) && n > 0){
// 使用...扩展运算符直接展开递归调用的结果,并将其添加到sum中,...比concat效率高
sum.push(...flat(arr[i], n-1));
}else{
sum.push(arr[i]);
}
}
return sum;
}
在进行递归调用时发现了一个问题,如果初始深度为n,在下次调用时深度要变为n-1,此时函数参数要为n-1,而不能是n--或--n。这是因为:
递归调用要保持每次递归是独立的,不能互相影响。
在递归的过程中,每递归一次就要让n-1,这样不会影响原始n的值,当退出这次的递归调用时,进行下一项的递归,仍然是最初要求的扁平深度。但是如果传递的参数是n--或--n,则会导致每递归一次,最外层也就是最初要求的扁平化深度会减小1,这样在遍历后面项如果需要递归,此时n已经发生了变化,就不能按照最初的要求将数组扁平化到需要的程度。