JS 数组扁平化

JS 数组扁平化的方法

什么是数组扁平化

数组的扁平化能够简单的理解为将一个多维数组转换成一个一维数组。
例若有一个数组 arr = [ 1, [ 2, [ 3, 4 ] ] ],
这个arr数组中索引为 1 上的元素仍然是一个数组,且内部仍然可能会出现这种状况,此时若是咱们想要对这个数组进行处理,而且处理以后的结果是 arr = [ 1, 2, 3, 4 ]。那么这个处理就叫作数组扁平化。数组

var arr = [1, [2, [3, 4]]];
 function flatten(){
    ...
 }
 console.log(flatten(arr));     //[1,2,3,4]

大概了解了什么是数组扁平化以后接下来就是思考如何去解决。code

方法一 :for循环+递归

这里使用最简单的例子来讲明,也就是arr = [ 1, [ 2, [ 3, 4 ] ] ],递归

var arr = [1, [2, [3, 4]]];
    
    function flatten(arr){
       var newArr = [],
           len = arr.length,
           toStr = {}.toString,
           item;
       for(var i = 0; i < len; i++){
           item = arr[i];
           if(toStr.call(item) === '[object Array]'){
                newArr.concat(flatten(item));
           }else{
                newArr.push(item);
           }
       }
       return newArr;
    }
    
    console.log(flatten(arr));

方法一的修改版:使用forEach

var arr = [1, [2, [3, 4]]];
    
    function flatten(arr){
       var newArr = [],
           toStr = {}.toString,
       arr.forEach(function(elem){
           toStr.call(elem) === '[object Array]' ?
                            newArr.concat(flatten(elem)) :
                            newArr.push(elem)
       })
       return newArr;
    }
    
    console.log(flatten(arr));

方法二:使用reduce

var arr = [1, [2, [3, 4]]];
    
    function flatten(arr){
       var toStr = {}.toString,
       return arr.reduce(function(prev,next){
           return prev.concat(toStr.call(next) === '[object Array]' ?
                                                flatten(next):
                                                next
           )
       },[])
    }
    
    console.log(flatten(arr));

使用reduce可以简化代码,但同时也须要更好的编写代码的能力。在这个场景使用reduce的时候推荐使用数组的concat方法,而不推荐使用数组的push方法,缘由是由于可能会因为不当心,忘记push方法的返回值是push进去的那个新元素,而不是返回push后的整个新数组。索引

function flatten(arr){
       var toStr = {}.toString,
       return arr.reduce(function(prev,next){
           return toStr.call(next) === '[object Array]' ?
                                     prev.concat(flatten(next)) :
                                     prev.push(next);
                                     //此处return的并不是是一个数组,因此在执行下次操做的时候会报错。
    //因此若是非要使用push的话,能够这样:
    //              toStr.call(next) === '[object Array]' ?
    //                                 prev = prev.concat(flatten(next)) :
    //                                 prev.push(next);
    //              return prev;
            )
       },[])

End.it

相关文章
相关标签/搜索