数组扁平化

es6提供的新方法 flat(depth)

let a = [1,[2,3]];  
a.flat(); // [1,2,3]  
a.flat(1); //[1,2,3]

flat(depth) 方法中的参数 depth,代表展开嵌套数组的深度,默认是 1.如果我们可以提前知道数组的维度,对这个数组进行扁平化处理,参数depth的值就是数组的维度减一。

或者直接设置为 infinity

let a = [1,[2,3,[4,[5]]]];  
a.flat(Infinity); // [1,2,3,4,5]  a是4维数组

for 循环

function flatArr(arr){
  var res = [];
  for(let i = 0, length = arr.length; i< length; i++){
    if(Array.isArray(arr[i])){
      res = res.concat(floatArr(arr[i]))
    } else {
      res = res.concat(arr[i])
    }
  }
  return res
}

while 循环

var arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]];  
  function flatArr(arr){
    while(arr.some(item => Array.isArray(item))){
      console.log(...arr)
      arr = [].concat(...arr)
    }
    return arr ;
  }
flatArr(arr1); //[1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

split 配合 toString

这个只针对 数组的项全为数字,

 function flatArr( arr) {
  return arr.toString().split(',').map(item => +item);
}
flatArr(arr1); //[1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

// +"9" 等于9

reduce 方法

var arr1 = [1, 2, [3], [1, 2, 3, [4, [2, 3, 4]]]];
 function flatten(arr) {
      return arr.reduce((res,next) =>{
        return res.concat(Array.isArray(next)? flatten(next) : next);
      },[]);
    }

运用了数组的 reduce 方法, 需要注意的是 reduce 方法,我们传了两个参数. 第二个参数是一个空数组,也是作为遍历的开始.

最后更新于

这有帮助吗?