<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//数组的扁平化
//1.递归法
const arr = [1,[2,[3,4]]]
function flatten(arr){
//定义一个空数组
let res = []
//遍历每一个元素
for(let i=0;i<arr.length;i++){
//如果当前元素是数组的话就进行递归扁平化
if(Array.isArray(arr[i])){
//将扁平化的结果拼接到前面的已经扁平化的数组中
res = res.concat(flatten(arr[i]))
}
else{//如果当前元素不是数组的话直接加入res中
res.push(arr[i])
}
}
//最后return出去
return res
}
const arrRes = flatten(arr)
console.log(arrRes);
//2.扩展运算符法
function flatten2(arr){
//只要数组中还有嵌套的数组就继续循环展开
while(arr.some(item=>Array.isArray(item))){//有一个为true就返回true
//将数组展开拼接到新的数组中
arr = [].concat(...arr)
}
//最后return出去
return arr
}
const arrRes2 = flatten2(arr)
console.log(arrRes2);
//3.reduce法
// reduce是累计运算符
//简单讲解一下reduce
arr2=[1,2,3]
const resSum = arr2.reduce((acc,cur)=>acc+cur,0)//第一个参数累计运算的结果,第二个是当前的数值。零是acc初始值
console.log(resSum);
// function flatten3(arr){
// //返回扁平化数组
// return arr.reduce((acc,cur)=>Array.isArray(cur) ? flatten3(cur) : acc.push(cur)
// ,[])//使用reduce累计运算符从左到右依次进行处理,如果是数组就继续递归展开,不是数组就直接进行push
// }
//典型的错误:1.return acc.push(cur)确实是把元素添加到数组中了,但是返回值是一个数组的长度。concat返回的是一个数组
// 2.没有把递归展开的数组元素添加到数组中
function flatten3(arr){
//返回扁平化的数组。先逐一检查每个元素是否数组,是的话就递归展开拼接,不是就直接拼接。使用reduce累计运算符
return arr.reduce((arr,cur)=>Array.isArray(cur) ? arr.concat(flatten3(cur)) : arr.concat(cur) ,[])
}
const arrRes3 = flatten3(arr)
console.log(arrRes3);
</script>
</body>
</html>