手写题-常见入门题——实现数组扁平化
数组扁平化是什么呢?
数组的扁平化就是将一个嵌套多层的数组array转换为只有一层的数组。
也就是将 [1,[2,3],[4,[5,6]]] -> [1,2,3,4,5,6]
实现方法
一、for循环递归
空数组先拿到1,不为数组push ,res=[1],然后继续往后遍历,发现[2,3],为数组,然后开始拼接因为[2,3]打开后仍然为[2,3],所以res=[1,2,3],遍历发现[4,[5,6]]为数组,先判断 [4,[5,6]] 是否内嵌数组。
flatten([4,[5,6]]) 拿到的结果为 [4,5,6],然后与之前的[1,2,3]concat拼接,得到 [1,2,3,4,5,6]
function flatten(arr) {
let result = [];
for(let i = 0; i < arr.length; i++) {
// 判断当前元素是否是一个数组
if(Array.isArray(arr[i])) {
// 为数组拼接,并且看该元素数组是否又内嵌数组
result = result.concat(flatten(arr[i]));
}
// 否则直接加入结果数组
else {
result.push(arr[i]);
}
}
return result;
}
二、 toString() / jon+split + map转number实现
利用数组自带的toString() 将数组直接变成,分隔的字符串。也可以用join(',')代替toString()
"'1','2','3','4','5','6'" 然后通过split变回数组['1','2','3','4','5','6'],
注意得到的是字符串数组,所以我们要将每个元素转换回原来的数字。
function flatten(arr) {
return arr.toString().split(',').map(function(item) {
return Number(item);
})
}
三、reduce实现
数组里提供了一个reduce函数。用的
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback: 执行数组中的每个值(如果没有提供则第一个值除外)的函数,包括四个参数
accumulator: 累计器累计回调的返回值,她是上一次调用回调时返回的累积值
currenValue: 数组中正在处理的元素
利用reduce回调函数,充当了遍历,初始值为[],然后reduce遍历,原理与for循环递归差不多。
function flatten(arr) {
return arr.reduce(function(pre, cur){
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
}
四、ES6解构+some函数
先用数组的 some 方法把数组中仍然是组数的项过滤出来,然后执行 concat 操作,利用 ES6 的展开运算符,将其拼接到原数组中,最后返回原数组
[1,[2,3],[4,[5,6]]] 其中 some过滤得到[2,3] [4,[5,6]]
第一次 [1, 2, 3, 4, Array [5,[6, 7]]]
第二次 [1, 2, 3, 4, 5, [6, 7]]
第三次 [1,2,3,4,5,6]
function flatten(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
五、正则表达式替换
先JSON.stringify将数组变成字符串
然后正则表达式去掉所有的[和 ]
然后再加上前后[和 ]
最后转换回对象JSON.parse数组
"[1,[2,3],[4,[5,[6,7]]]]" > "1,2,3,4,5,6,7" > "[1,2,3,4,5,6,7]" -> [1,2,3,4,5,6]
function flatten(arr) {
let str = JSON.stringify(arr)
str = str.replace(/(\[|\])/g, '')
str = '[' + str + ']'
return JSON.parse(str)
}