主要是想记录一下这个递归思路。用这个数组扁平来举例。
let arr = [1, [2, 3, 3], 4, [5, 4]]; ==> 变成 [1, 2, 3, 3, 4, 5, 4]
首先想到就是循环,然后判断是不是数组,再进行递归
function flat (arr){
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if(Array.isArray(arr[i])){
// 这里就需要再循环进行判断,但是我只想递归for循环
// 然后我们就有两种选择了
// 第一种就是用这个flat函数进行递归,但是我们并不需要let newArr = []这部分代码,所以如果使用这个方法的话需要解决这个新创建数组的问题
// 第二种就是再创建一个函数,想递归哪里,就把函数写成什么。
}else{
newArr.push(arr[i]);
}
}
return newArr;
}
- 第一种方法,用本函数进行递归,解决这个新产生的数组问题
function flat(arr) {
let newArr = [];
for(let i = 0; i < arr.length; i++){
if(Array.isArray(arr[i])){
// 就是把返回数组进行解构,再进行与原来数组进行拼接。
// 这样就可以把递归的产生的数据拼接到最开始创建的数组了。
newArr = newArr.concat(...flat(arr[i]));
}else{
newArr.push(arr[i]);
}
}
return newArr ;
}
- 第二种方法,想递归哪里,就把哪里写成函数。
只想把for那段代码的进行递归,所以将那块代码写成函数,把需要的参数传进去就可以了
function flat (arr){
let newArr = [];
judge(arr, newArr);
return newArr;
}
function judge(arr, newArr){
for (let i = 0; i < arr.length; i++) {
if(Array.isArray(arr[i])){
// 这样递归的话,我们就可以不用考虑新创建的数组问题了。
judge(arr[i], newArr);
}else{
newArr.push(arr[i]);
}
}
}