数组扁平化

Array.prototype.flat() 是用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

const animals = ["🐷", ["🐶", "🐂"], ["🐎", ["🐑", ["🐲"]], "🐛"]];

// 不传参数时,默认“拉平”一层
animals.flat();
// ["🐷", "🐶", "🐂", "🐎", ["🐑", ["🐲"]], "🐛"]

// 传入一个整数参数,整数即“拉平”的层数
animals.flat(2);
// ["🐷", "🐶", "🐂", "🐎", "🐑", ["🐲"], "🐛"]

// Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
animals.flat(Infinity);
// ["🐷", "🐶", "🐂", "🐎", "🐑", "🐲", "🐛"]

// 传入 <=0 的整数将返回原数组,不“拉平”
animals.flat(0);
animals.flat(-10);
// ["🐷", ["🐶", "🐂"], ["🐎", ["🐑", ["🐲"]], "🐛"]];

// 如果原数组有空位,flat()方法会跳过空位。
["🐷", "🐶", "🐂", "🐎",,].flat();
// ["🐷", "🐶", "🐂", "🐎"]


下面手写实现 flat

    // 1.数组 flat 方法的简单实现
    const animals = ["🐷", ["🐶", "🐂"], ["🐎", [["🐲"], "🐑"], "🐛"]];

    /*     function flat(target, newArr = []) {
          for (let i = 0; i < target.length; i++) {
            if (Array.isArray(target[i])) {
              flat(target[i], newArr);
            } else {
              newArr.push(target[i]);
            }
          }
          return newArr;
        }
    
        function flat1(arr) {
          let arrResult = [];
          arr.forEach(item => {
            if (Array.isArray(item)) {
              arrResult = arrResult.concat(arguments.callee(item));   // 递归
              // 或者用扩展运算符
              // arrResult.push(...arguments.callee(item));
            } else {
              arrResult.push(item);
            }
          });
          return arrResult;
        } */

    // 2.用 reduce 实现 flat
    /* function flat(arr) {
      return arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? flat(cur) : cur), [])
    }

    console.log(flat(animals)); */

    // 3. 用栈的思想实现 flat
    /* function flat(arr) {
      let result = [];
      let stack = [].concat(arr); // 不直接赋值,不然修改 stack 会修改原数组

      //如果栈不为空,则循环遍历
      while (stack.length !== 0) {
        let val = stack.pop();
        if (Array.isArray(val)) {
          stack.push(...val); //如果是数组再次入栈,并且展开了一层
        } else {
          result.unshift(val); //如果不是数组就将其取出来放入结果数组中
        }
      }
      return result;
    }

    console.log(flat(animals)); */

    // 4. 传入一个整数来控制“拉平”的层数
    /*     function flat(arr, num = 1) {
          return num > 0 ?
            arr.reduce((acc, cur) => {
              return acc.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur)
            }, [])
            :
            arr  // [].aconcat(arr) / arr.slice()
        }
    
        console.log(flat(animals, Infinity)); */

    // 5. 使用 Generator 实现 flat 函数
    function* flat(arr, num = 1) {
      for (const item of arr) {
        if (Array.isArray(item) && num > 0) {
          yield* flat(item, num - 1);
        } else {
          yield item;
        }
      }
    }
    console.log([...flat(animals, Infinity)]);
 posted on 2021-03-30 23:23  kly99  阅读(69)  评论(0)    收藏  举报