• 数组扁平化


    数组扁平化是指将一个多维数组变成一维数组。

    一、flat方法

    flat()方法创建一个新数组,其中所有子数组元素都以递归方式连接到该数组中,直到达到指定的深度为止

    const arr1 = [1, 2, [3, 4, [5, 6]]];
    arr1.flat(2);          // [1, 2, 3, 4, 5, 6]

    const arr2 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
    arr2.flat(Infinity);        // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]       // Infinity代表子数组层数

    二、toString方法+split方法

    调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组。split分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型。

    function flatten(arr) {
      console.log(arr.toString());                     // 1,2,3,4,5,6        (使用join方法可以实现和toString方法类似的效果。)
      console.log(arr.toString().split(','));        //[ '1', '2', '3', '4', '5', '6' ]
      return arr.toString().split(',').map(function(item) {
        return Number(item);
      })
    }
    let ary = [1, [2, [3, [4, 5]]], 6];
    console.log(flatten(ary));                              // [ 1, 2, 3, 4, 5, 6 ]

    三、ES6扩展运算符

    es6的扩展运算符能将二维数组变为一维,若arr中含有数组则使用一次扩展运算符,直至没有为止。

    const arr = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
    function flatten(arr) {
      while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
      }
      return arr;
    }
    console.log(flatten(arr))

    四、递归

    递归的遍历每一项,当为数组时则继续,不为数组则concat。

    function flatten(arr) {
      var result = [];
      for (var i = 0, len = arr.length; i < len; i++) {
        if (Array.isArray(arr[i])) {
          result = result.concat(flatten(arr[i]))
        }else {
          result.push(arr[i])
        }
      }  
      return result;
    }

    五、reduce方法实现

    reduce方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

    function flatten(arr) {
      return arr.reduce((result, item)=> {
        return result.concat(Array.isArray(item) ? flatten(item) : item);
      }, []);
    }
    let ary = [1, [2, [3, [4, 5]]], 6];
    console.log(flatten(ary)); // [ 1, 2, 3, 4, 5, 6 ]

  • 相关阅读:
    java23中设计模式之策略模式
    java23中设计模式之模板模式
    java23中设计模式之备忘录模式
    java23中设计模式之命令模式
    java23中设计模式之中介者模式
    java23中设计模式之迭代器模式
    java23中设计模式只责任链模式
    web service -- jdk spring cxf ajax 开发(2)
    洛谷 P1566 加等式
    洛谷 P1439 【模板】最长公共子序列
  • 原文地址:https://www.cnblogs.com/heisetianshi/p/14657508.html
Copyright © 2020-2023  润新知