数组扁平化

作者: 姜治宇 | 来源:发表于2020-04-08 20:45 被阅读0次

    数组扁平化,就是将多维数组变成一维数组:

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

    如何实现呢?
    最简单的方案是利用reduce,先复习下这个函数:

    arr.reduce(callback,[initialValue])
    /*
    callback (执行数组中每个值的函数,包含四个参数)
    
        1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
        2、currentValue (数组中当前被处理的元素)
        3、index (当前元素在数组中的索引)
        4、array (调用 reduce 的数组)
    
    initialValue (作为第一次调用 callback 的第一个参数。)
    */
    

    给定初始值initialValue为[], 用previousValue来concat合并currentValue:

    let arr = [1, [2, 3, [4, 5]]]
    
    function flatten(arr) {
        return arr.reduce((previousValue, currentValue)=> {
            return previousValue.concat(currentValue);
        }, []);
    }
    
    let newarr = flatten(arr)
    
    console.log(newarr)
    

    这样可以吗?看一下执行结果:

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

    有点问题,二维数组可以扁平化为一维,但三维的只能扁平化为二维,扁平化的不彻底,怎么办呢?
    很简单,判断当前元素currentValue是数组时,让他递归。

    let arr = [1, [2, 3, [4, 5]]]
    function flatten(arr) {
        return arr.reduce((previousValue, currentValue)=> {
            if(Array.isArray(currentValue)){
                
                return previousValue.concat(flatten(currentValue))
                
            } else {
                return previousValue.concat(currentValue)
            }
    
        }, []);
    }
    
    let newarr = flatten(arr)
    console.log(newarr)
    

    代码看着有点啰嗦,我们用三元运算符改一下:

    let arr = [1, [2, 3, [4, 5]]]
    
    function flatten(arr) {
        return arr.reduce((previousValue, currentValue)=> {
    
            return previousValue.concat(Array.isArray(currentValue)? flatten(currentValue): currentValue)
    
        }, []);
    }
    
    let newarr = flatten(arr)
    console.log(newarr)
    

    相关文章

      网友评论

        本文标题:数组扁平化

        本文链接:https://www.haomeiwen.com/subject/zcexmhtx.html