数组的扁平化方法以及优缺点分析

622 阅读2分钟

数组的扁平化概念是指将一个多维数组变成是一个一维数组

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

具体实现

方法一:最常用的方法递归法:

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

方法二:使用es6新特性扩展运算符:

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

方法三:使用reduce方法:

数组的reduce方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行,将其结果汇总称为单个返回值)

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

callback:
    执行数组中的每个值(如果没有提供则第一个值除外)的函数,包括四个参数
    accumulator:
        累计器累计回调的返回值,她是上一次调用回调时返回的累积值
    currenValue:
        数组中正在处理的元素
        
function flatten(arr) {  
    return arr.reduce((result, item)=> {
        return result.concat(Array.isArray(item) ? flatten(item) : item);
    }, []);
}

方法四:toString & split

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

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

方法五:使用join&split

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

function flatten(arr) {
    return arr.join(',').split(',').map(function(item) {
        return parseInt(item);
    })
}

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

数组遍历,对象遍历

数组遍历的方法有很多,比如说我们常用的pop,push,shift,unshift数组还有split和slice对数组进行增删改操作

for in 语句用于对数组或者是对象的属性进行循环操作

for of 循环可以使用的范围包括数组,set和map结构,某些类似数组的对象(argument对象,Dom节点对象)

for in 可以循环遍历对象的属性,原型链上的所有属性都将被访问

同时可以遍历对象的还有Object.keys(),只遍历自身属性

缺点分析

以上的这几种解决数组扁平化的实现就只是针对的是数字,但是如果是非数字的就需要另外的方式进行数组的扁平化