拍平数组flat

120 阅读1分钟

flat 拍平数组

forEach + 递归

Array.prototype.flat = function (dep = 1) {
  // 获取 需要操作的数组
  const _array = this;
  // 新建一个数组
  const array = [];
  // 遍历元素
  _array.forEach(item => {
    // 判断是否为数组 且 是否需要 拍平
    if (Array.isArray(item) && dep >= 1) {
      // 把 falt() 拍平这个数组 加入array
      array.push(...item.flat(dep - 1));
    } else {
      // 直接加入新数组
      array.push(item);
    }
  });
  // 返回
  return array;
};

const animals = ['🐷', ['🐶', '🐂'], ['🐎', ['🐑', ['🐲']], '🐛']];
// animals.flat()
console.log(animals.flat()); // ['🐷', '🐶', '🐂', '🐎', Array(2), '🐛']
console.log(animals.flat(1)); // ['🐷', '🐶', '🐂', '🐎', Array(2), '🐛']
console.log(animals.flat(2)); // ['🐷', '🐶', '🐂', '🐎', '🐑', Array(1), '🐛']
console.log(animals.flat(3)); // ['🐷', '🐶', '🐂', '🐎', '🐑', '🐲', '🐛']

reduce

Array.prototype.flat = function (dep = 1) {
  // 获取 需要操作的数组
  const _array = this;
  // 新建一个数组
  const array = [];
  // 遍历元素
  return _array.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) && dep-- >= 1 ? cur.flat(dep) : cur);
  }, []);
};
console.log(animals.flat()); // ['🐷', '🐶', '🐂', '🐎', Array(2), '🐛']
console.log(animals.flat(1)); // ['🐷', '🐶', '🐂', '🐎', Array(2), '🐛']
console.log(animals.flat(2)); // ['🐷', '🐶', '🐂', '🐎', '🐑', Array(1), '🐛']
console.log(animals.flat(3)); // ['🐷', '🐶', '🐂', '🐎', '🐑', '🐲', '🐛']