数组扁平化

53 阅读1分钟
  1. 递归实现 reduce
  2. 迭代实现
  3. 控制展开层数
// 递归
function flatten1(arr){
  if (!arr.length) return;
  return arr.reduce((pre, cur) => {
    // cur 依次是1, [2, 3, [4, 5]], 2, 3, [4, 5], 4, 5
    // 判断当前元素是不是数组,是的话继续递归
    return Array.isArray(cur) ? [...pre, ...flatten1(cur)] : [...pre, cur];
  }, []);
};
function flatten3(arr, num = 1) {
  if (!arr.length) return;
  // num控制展开层数
  return num > 0
    ? arr.reduce((pre, cur) => {
        return Array.isArray(cur) ? [...pre, ...flatten3(cur, num - 1)] : [...pre, cur];
      }, [])
    : arr.slice();
}
const arr1 = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5];
console.log(flatten3(arr1, Infinity));
console.log(flatten3(arr1, 2));

// 迭代
const flatten2 = arr => {
  if (!arr.length) return;
  let res = arr.slice();
  // 一直展开直到数组中没有数组元素了
  while (res.some(item => Array.isArray(item))) {
    res = [].concat(...res); // 数组中还有数组元素则继续展开一层数组 
  }
  return res;
};
const flatten4 = (arr, num = 1) => {
  if (!arr.length) return;
  let res = arr.slice();
  // num规定展开多少层
  while (num > 0) {           
    if (res.some(item => Array.isArray(item))) {
      res = [].concat.apply([], res);    // 数组中还有数组元素则继续展开一层数组
    } else {
      break;
    }
    num--;
  }
  return res;
};

[].concat(...arr); [].concat.apply([], res); 实现数组展开一层,详见concat章节