数组扁平化

465 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

前言

何为数组扁平化呢?数组扁平化我理解的就是把一个嵌套多层的数组变为只有一层的数组,大致就像这样吧 var a=[1,[2,[3]]]扁平化处理后得到的是[1,2,3]

实现数组扁平化

  • 递归,这个方法在之前的一个文章中有所提到,大致思路就是通过递归来判断目标数组的每一项是不是数组,如果是数组就递归处理,如果不是就push进result数组,知道循环结束,具体代码可点击这里
  • toString ,这种方法只使用于数组的项都是数字的情况,如下代码
// 方法2
var arr = [1, [2, [3, 4]]];

function myFlat(arr) {
    return arr.toString().split(',').map(function(item){ //这里map的作用是把字符串再转换回数字
        return +item
    })
}

console.log(myFlat(arr))

这种方法的缺点很明显,那就是如果数组项不全是数字就会出问题,加入有个项是字符串,转换的结果会变成数字。 注:扁平化的特点之一就是不能改变原数组中各项的数组类型。

  • es6中的展开运算符 es6中的展开运算符可以展开目标元素的各项,如下 var a=[1,[2,[3]]] console.log([].concat(...a)) ,得到的结果如下图:

image.png 只展开了一层,根据这个特性,我们加个循环即可,如下代码

function myFlat(arr) {

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

    return arr;
}

这里要多说一嘴,concat如果参数是数组的话,那么添加的就自动是数组中的项,而不是数组

  • flat(),es6中其实已经提供了数组扁平化的函数,应该也是由递归来实现的

总结

数组扁平化的方法除了上述的方法外还有其它的方法,比如通过reduce函数来实现;通过正则表达式也可以实现,这里就不做过多的探索了,有兴趣的自行查阅。

刚在查阅资料的时候看到个有意思的东西,感觉挺有道理的,分享给大家,如下图

image.png

看到这句话让我想到了福尔摩斯曾经说过的那句话-- 当你排除一切不可能的情况,剩下的,不管多难以置信,那都是事实。

总之,实现一个功能的方法有很多,有时候要看场景来选择到底要采用那种,有时甚至可以根据自己的喜好来决定到底用什么方法。