数组的扁平化和去重

166 阅读1分钟

数组的扁平化

  • 就是剥离数组的嵌套行为

例子

var arr3 = [1,2,[1,2,[1,2]]] => [1,2,1,2,1,2]

ES6-API

        var arr=[1,2,[1,2,[1,2]]]
        let arr1 = arr.flat(10)
        console.log(arr1);//(6) [1, 2, 1, 2, 1, 2]

reduce+递归

        var arr=[1,2,[1,2,[1,2]]]
        function flatDeep(arr){
          //用到了reduce,设置prev为[]
          return arr.reduce((prev,item)=>{
            //对数组中的每个元素进行判断
            if(Array.isArray(item)){
              //是数组的话,进行递归
              return [...prev,...flatDeep(item)]
            }else{
              //不是数组就直接加进来
              return [...prev,item]
            }
          },[])
        }
        let arr2 = flatDeep(arr)
        console.log(arr2);//(6) [1, 2, 1, 2, 1, 2]

reudce+递归(简化版)

      var arr = [1, 2, [1, 2, [1, 2, 3]]];
      function flatDeep(arr) {
        return arr.reduce((prev, item) => {
          return prev.concat(Array.isArray(item) ? flatDeep(item) : item);
        }, []);
      }
      let arr2 = flatDeep(arr);
      console.log(arr2); //(6) [1, 2, 1, 2, 1, 2, 3]
  • 这里对concat进行解释一下
//因此在上面我们不用对递归flatDeep的返回值进行[...flatDeep(item)]
//但是concat只支持一层的数组,不支持双层的
arr.concat([3]) === arr.concat(3)

数组去重

ES6-API

      var arr = [1, 2, 1, 2, 1, 2, 3];
      //一种新的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复。
      let arr1 = new Set(arr);
      //此时arr1是set结构,不是数组结构
      //注意:最后还是想用数组的话,要进行转化
      console.log([...arr1]);//1,2,3

filter+indexOf

      var arr = [1, 2, 1, 2, 1, 2, 3];
      function deleteRepeat(arr){
      //遍历数组中的元素
        return arr.filter((item,index,array)=>
          arr.indexOf(item) === index
        )
      }
      let res = deleteRepeat(arr)
      console.log(res);