JavaScript训练合集——数组扁平化
这期的内容是数组扁平化,这也是很考察基本功的一道题,解决的办法也比较多。
什么是数组扁平化
常规的解释就是把一个多维数组转成一维数组,比如形如[1, [2, [3, [4, [5]]]]]
的数组转为[1,2,3,4,5]
。
// 来个示例数组 let arr = [1, [2, [3, [4, [5]]]]]; 复制代码
flat()方法 + Infinity
JS
是有提供原生处理数组扁平化的方法的,就是flat()
方法,但是flat()
默认是拉平一层的嵌套数组,传入数字几就拉平几层。但是在很多情况下,我们并不能直接知道要拉平的数组长度,所以我们可以传一个Infinity
进去,Infinity
代表无穷大,所以无论你数组长度是多少,都可以给你拉平。
let brr1 = arr.flat(Infinity); console.log(brr1); 复制代码
JSON对象
JSON.stringify
可以把数组或对象转为字符串,JSON,parse
可以把字符串转为对应的数组和对象,我们可以先将数组转为字符串,然后通过replace
方法把多余的]或[
去掉,就可以实现数组的扁平化。
let brr2 = JSON.parse("[" + JSON.stringify(arr).replace(/\[|\]/g, "") + "]"); console.log(brr2); 复制代码
递归
最常规最原始的办法就是通过递归来完成,在每一次递归的过程中,如果碰到当前的项不是数组的值,就push
到一个新数组里面,如果是数组,就遍历这个数组。
let brr3 = arr => { /** * 用递归, 用for循环加递归也可以, 这里用reduce * reduce 累加器, 本质上也是循环 * cur 是循环的当前一个值, 相当于for循环里的arr[i], pre是前一个值, * 相当于for循环里的 arr[i - 1] */ let crr = arr.reduce((pre, cur) => { return pre.concat(Array.isArray(cur) ? brr3(cur) : cur); }, []) return crr; } console.log(brr3(arr)); // [1, 2, 3, 4, 5] 复制代码
递归遍历的过程方法也有很多,可以使用原始的for
循环,也可以使用一些ES5 ES6
的高阶API
来完成。
作者:CreatorRay123
链接:https://juejin.cn/post/7029609816188272647