zoukankan      html  css  js  c++  java
  • 数组扁平化的五种方法

    数组扁平化概念

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

    [1, [2, 3, [4, 5]]]  ------>    [1, 2, 3, 4, 5]
    

    实现

    1. reduce

    参数

    • callback

      执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数:

      accumulator累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。currentValue数组中正在处理的元素。index 可选数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。array可选调用reduce()的数组

    • initialValue可选

      作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

    语法

    arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
    

    遍历数组每一项,若值为数组则递归遍历,否则concat。

    function flatten(arr) {  
        return arr.reduce((result, item)=> {
            return result.concat(Array.isArray(item) ? flatten(item) : item);
        }, []);
    }
    

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

    2. toString & split

    调用数组的toString方法,将数组变为字符串,然后再用split分割还原为数组

    function flatten(arr) {
        return arr.toString().split(',').map(item => Number(item))
    }
    

    因为split分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型

    3. join & split

    和上面的toString一样,join也可以将数组转换为字符串

    function flatten(arr) {
        return arr.join(',').split(',').map(item => Number(item))
    }
    

    4. 递归

    递归的遍历每一项,若为数组则继续遍历,否则concat

    function flatten(arr) {
        var res = [];
        arr.map(item => {
            if(Array.isArray(item)) {
                res = res.concat(flatten(item));
            } else {
                res.push(item);
            }
        });
        return res;
    }
    

    5. 扩展运算符

    es6的扩展运算符能将二维数组变为一维

    [].concat(...[1, 2, 3, [4, 5]]);  // [1, 2, 3, 4, 5]
    

    根据这个结果我们也可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。

    function flatten(arr) {
        while(arr.some(item=>Array.isArray(item))) {
            arr = [].concat(...arr);
        }
        return arr;
    }
    

    总结

    虽然说写了5种方法,但是核心也只有一个:

    遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。

  • 相关阅读:
    Django forms组件
    Django 分页器
    Django Ajax
    Django 多表操作2
    js12种应该注意的地方
    Web自动化测试python环境中安装 --selenium安装、火狐和火狐驱动版本、谷歌和谷歌驱动版本、测试
    python学习-文件操作
    关于redis搭建环境
    扩展知识
    javascript之Banner图片焦点轮播
  • 原文地址:https://www.cnblogs.com/w-yh/p/12053575.html
Copyright © 2011-2022 走看看