javascript数组扁平化(三种常见的方法)

53 阅读1分钟
<!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>