手写数组扁平化-常见解法

125 阅读1分钟

手写题-常见入门题——实现数组扁平化

数组扁平化是什么呢?

数组的扁平化就是将一个嵌套多层的数组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)
}