JavaScript数组扁平化
YinJie… 人气:2数组的扁平化就是将一个嵌套多层的数组 array(嵌套可以是任何层数)转换为只有一层的数组。
var arr = [1, [2, [3, 4, 5]]]; console.log(flatten(arr)); // [1, 2, 3, 4,5]
本文就是要用多种方法实现这个 flatten 函数
1. 常规递归法
var a = [1, [2, [3, 4, 5]]]; function flatten(arr) { let newArray = [] for (let i of arr) { if (i.constructor === Array) { newArray = newArray.concat(flatten(i)) } else { newArray.push(i) } } return newArray } console.log(flatten(a)); // [1, 2, 3, 4,5]
这段代码核心就是循环遍历过程中的递归操作,就是在遍历过程中发现数组元素还是数组的时候进行递归操作,把数组的结果通过数组的 concat 方法拼接到最后要返回的 result 数组上,那么最后输出的结果就是扁平化后的数组。
2. reduce方法
var a = [1, [2, [3, 4, 5]]]; function flatten(arr) { return arr.reduce((pre,next) => { return pre.concat(next instanceof Array ? flatten(next) : next) },[]) } console.log(flatten(a)); //[ 1, 2, 3, 4, 5 ]
我们可以看到 reduce 的第一个参数用来返回最后累加的结果,思路和第一种递归方法是一样的,但是通过使用 reduce 之后代码变得更简洁了,也同样解决了扁平化的问题。
3. 扩展运算符实现
// 方法3 var arr = [1, [2, [3, 4]]]; function flatten(arr) { while (arr.some(item => Array.isArray(item))) { arr = [].concat(...arr); } return arr; } console.log(flatten(arr)); // [1, 2, 3, 4,5]
我们先用数组的 some 方法把数组中仍然是组数的项过滤出来,然后执行 concat 操作,利用 ES6 的展开运算符,将其拼接到原数组中,最后返回原数组,达到了预期的效果。
4. split和toString共同处理
// 方法4 var arr = [1, [2, [3, 4]]]; function flatten(arr) { return arr.toString().split(','); } console.log(flatten(arr)); // [1, 2, 3, 4]
数组会默认带一个 toString 的方法,可以把数组直接转换成逗号分隔的字符串,然后再用 split 方法把字符串重新转换为数组
加载全部内容