牛客JS题(二十一)数组扁平化

发布于:2024-08-08 ⋅ 阅读:(108) ⋅ 点赞:(0)

注释很详细,直接上代码

涉及知识点:

  1. 递归
  2. flat
  3. 字符串操作
  4. 正则表达式替换

题干:
在这里插入图片描述

我的答案

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script>
      /**
       * 这题方法确实很多,每种类似咱都举例一种昂,
       * 其他各种组合也都是改变些许,就不多说了
       */
      let arr = [
        [0, 1],
        [2, [3, [4, [5, 6]]]],
      ];
      /**
       * 使用递归实现
       * 当遇到非数组时直接放进数组返回,
       * 遇到数组就递归调用自身,并将返回值拼接起来
       */
      const _flatten = (arr) => {
        // 补全代码

        let result = [];

        arr.forEach((element) => {
          if (Array.isArray(element)) result = result.concat(_flatten(element));
          else result.push(element);
        });
        return result;
      };

      console.log(_flatten(arr));

      /**
       * 使用flat()实现(开发首选)
       * 当然在牛客好像不支持,交题别用这个 
       */
      const _flatten1 = (arr) => arr.flat(Infinity);

      console.log(_flatten1(arr));

      /**
       * 扩展运算符实现
       * 用扩展运算符的小友可能会有误区,
       * 直接使用其实只会扩展第一层的数组,
       * 所以需要使用while循环,
       * 每次循环都会将数组中的数组展开再拼接赋值,
       * 直到数组中没有对象为数组为止 
       */
      const _flatten2 = (arr) => {
        let newArr = JSON.parse(JSON.stringify(arr));
        while (newArr.some((item) => Array.isArray(item)))
          newArr = [].concat(...newArr);
        return newArr;
      };
      console.log(_flatten2(arr));

      /**
       * 字符串操作函数实现
       * toString将数组变成"0,1,2"的形式,
       * 分割再组成数组即可
       */
      const _flatten3 = (arr) => arr.toString().split(",").map(Number);

      console.log(_flatten3(arr));

      /**
       * 使用正则表达式替换实现
       * 一开始我们肯定需要转字符串,但用的是JSON.stringify,
       * 将数组变成"[0,1,2]"的形式,
       * 使用将`[`或者`]`正则表达式进行全局替换为空值,
       * 然后再分割再组成数组即可
       */
      const _flatten4 = (arr) =>
        JSON.stringify(arr)
          .replace(/[\[|\]]/g, "")
          .split(",")
          .map(Number);
          console.log( JSON.stringify(arr)
          .replace(/[\[|\]]/g, ""));
      console.log(_flatten4(arr));
    </script>
  </body>
</html>

博客更新不是很及时,需要看后面内容的可以看看我的gitee仓库

牛客JS题Gitee仓库


网站公告

今日签到

点亮在社区的每一天
去签到