数组扁平化:多维数组转为一维数组

73 阅读1分钟

ES6中的flat

const arr = [1,2,[3,[4,5]],6]
console.log(arr.flat(Infinity))  // [1,2,3,4,5,6]

递归

const arr = [1,2,3,[4,[5,6]],7]
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
}
console.log(flatten(arr))  // [1,2,3,4,5,6,7]

reduce函数迭代

arr.reduce(callback,[initalValue])

reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:

callback (执行数组中每个值的函数,包含四个参数)

    1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))  
    (没有initialValue,previousValue就是索引为0的那个值,currentValue就从索引为1开始)
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4array (调用 reduce 的数组)

initialValue (作为第一次调用 callback 的第一个参数。)
如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
const arr = [1,2,3,[4,[5,6]],7]
function flatten(arr){
  return arr.reduce((pre,cur)=>{
   return pre.concat(Array.isArray(cur) ? flatten(cur):cur)
  },[])  //传递初始值空数组[],就会从数组索引为0的元素开始执行
}
console.log(flatten(arr))  // [1,2,3,4,5,6,7]

执行过程:

  • 第一次执行,初始值传入[],走到reduce的回调里,参数pre就是[],参数cur就是数组的第一项1,回调内[].concat(1)
  • 第二次执行,reduce的回调参数pre是上一次回调执行的结果1,继续用它来concat数组的第二项2,得到结果[1,2]作为下一次回调执行的参数pre继续执行下去
  • 。。。以此类推