# 数组扁平化

# 扁平化是什么?

数组的扁平化,就是将一个嵌套多层的 array 转换为只有一层的 array

举个 🌰 :有个 flatten 函数做扁平化

var arr = [1, [2, [3, 4], 5]];
console.log(flatten(arr)) // [1, 2, 3, 4, 5]

# 递归

我们最开始能想到的莫过于循环数组元素,如果还是数组,就递归调用该方法:

var arr = [1, [2, [3, 4], 5]];

function flatten(arr) {
  var result = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flatten(arr[i]));
    } else {
      result.push(arr[i]);
    }
  }
  return result;
}

# reduce

既然是对数组做处理,最终返回值,可以考虑用 reduce 来简化代码:

function flatten(arr) {
  return arr.reduce((prev, curr) => {
    return prev.concat(Array.isArray(curr) ? flatten(curr) : curr);
  }, [])
}

# ES6扩展运算符

用于取出参数对象的所有可遍历属性,拷贝到当前对象中

var arr = [1, [2, [3, 4], 5]];
console.log([].concat(...arr)); // [1, 2, [3, 4], 5]

这种方法只可以扁平一层,所以要进行扩展

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

# toString

如果数组元素都是数字的话可以尝试:

 [1, [2, [3, 4], 5]].toString() // "1,2,3,4,5"

 var arr = [1, [2, [3, 4], 5]];
 function flatten(arr) {
   return arr.toString().split(',').map(item => +item);
 }
 console.log(flatten(arr)); // [1, 2, 3, 4, 5]