当前位置: 首页 > article >正文

数组扁平化 JS代码实现 + 常用数组方法(未完)

文章目录

  • 数组扁平化
    • 定义
    • (1) ES6的flat方法
    • (2) 使用正则
      • JSON.stringify & parse
    • (3) 使用递归
    • (4) 使用 reduce(不太明白)
    • (5) 使用栈的思想实现 flat 函数
  • ES6数组的常用方法

数组扁平化

定义

在JavaScript中,数组扁平化(Array Flattening)是指将一个多维数组(即数组内部还包含数组)转换为一维数组的过程。简单来说,就是将一个嵌套数组展开成单个层级的数组。

  • 举例
let nestedArray = [1, [2, [3, 4], 5], 6];

扁平化之后:
[1, 2, 3, 4, 5, 6]

(1) ES6的flat方法

数组自带的扁平化方法,flat的参数代表的是需要展开几层,如果是Infinity的话,就是不管嵌套几层,全部都展开

const arr = [1,[2,[3,[4,5]]],6]
//  方法一:数组自带的扁平化方法,flat的参数代表的是需要展开几层,如果是Infinity的话,就是不管嵌套几层,全部都展开
console.log(arr.flat(Infinity))

(2) 使用正则

  1. 首先是使用 JSON.stringify 把 arr 转为字符串
  2. 接着使用正则把字符串里面的 [ 和 ] 去掉
  3. 然后再拼接数组括号转为数组对象
const arr = [1,[2,[3,[4,5]]],9]
const res = JSON.stringify(arr).replace(/\[|\]/g,'')
const res2 = JSON.parse('[' + res + ']')
console.log(res2)

JSON.stringify & parse

JSON.stringify() 方法将一个 JavaScript 值(对象、数组、字符串、数字、布尔值等)转换成一个 JSON 字符串。如果该值无法被序列化,那么 JSON.stringify() 会抛出一个错误。

let obj = {
  name: "Kimi",
  age: 30,
  isAdmin: true
};

let jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:{"name":"Kimi","age":30,"isAdmin":true}

(3) 使用递归

const array = [] //存储扁平化后的元素
const  fn = (arr)=>{
    for(let i = 0;i<arr.length; i++){
        if(Array.isArray(arr[i])){ //函数检查当前索引 i 处的元素是否是一个数组
            fn(arr[i]) //函数会重复执行,直到遇到非数组元素。
        }
        else {
            array.push(arr[i])
        }
    }
}
fn(arr)
console.log(array)

(4) 使用 reduce(不太明白)

const newArr = (arr)=>{
            return arr.reduce((pre,cur)=>{
                return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)
            },[])
        }
console.log(newArr(arr),"reduce方法")

return arr.reduce((pre, cur) => {

reduce 方法的第一个参数是一个回调函数,这个回调函数有两个参数:precurpre 是累加器的值,即上一次回调函数返回的结果;cur 是当前正在处理的数组元素。

return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)

这是 reduce 方法回调函数的主体部分。它首先检查当前元素 cur 是否是一个数组。如果是数组,那么递归调用 newArr 函数来处理这个子数组,并将结果与 pre 进行 concat 操作,即合并两个数组。如果不是数组,就直接将 curpre 进行 concat 操作。

(5) 使用栈的思想实现 flat 函数

// 栈思想
function flat(arr) {
  const newArr = [];
  const stack = [].concat(arr);  // 将数组元素拷贝至栈,直接赋值会改变原数组//如果栈不为空,则循环遍历while (stack.length !== 0) {
    const val = stack.pop(); // 删除数组最后一个元素,并获取它if (Array.isArray(val)) {
      stack.push(...val); // 如果是数组再次入栈,并且展开了一层
    } else {
      newArr.unshift(val); // 如果不是数组就将其取出来放入结果数组中
    }
  }
  return newArr;
}

let arr = [12, 23, [34, 56, [78, 90, 100, [110, 120, 130, 140]]]];
console.log(flat(arr));
// [12, 23, 34, 56, 78, 90, 100, 110, 120, 130, 140]

作者:LeetCode
链接:https://leetcode.cn/leetbook/read/interview-coding-frontend/dqaprj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ES6数组的常用方法


http://www.kler.cn/news/362367.html

相关文章:

  • 【C++打怪之路Lv11】-- stack、queue和优先级队列
  • 后台管理员登录实现--系统篇
  • 电机编码器
  • <大厂实战经验> Flutter鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
  • 深度学习 基本函数01
  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
  • C++ 通用数据库操作之 SOCI
  • YOLOv11改进策略【卷积层】| SAConv 可切换的空洞卷积 二次创新C3k2
  • 【建议收藏】大数据Flink入门专栏-v1.0,配套B站视频教程1小时速通
  • 各种数据类型的定义与常规计算
  • 京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?
  • leetcode hot100【LeetCode 49. 字母异位词分组】java实现
  • 理解多线程中的上下文切换:原理解析与Java模拟实现
  • 2024入门测参考答案(c语言版)
  • C#学习笔记(五)
  • 如何将logism电路转为verilog(一)
  • 【JavaScript】Javascript基础Day02:运算符、分支、循环
  • 从新手到高手:map和set的使用技巧全攻略(C++)
  • 自由学习记录(14)
  • ‌竞赛报名网站毕设计算机毕业设计基于SpringBootSSM框架
  • 第二十七篇:传输层讲解,TCP系列一
  • 内核提供的通用I2C设备驱动I2C-dev.c分析:file_ops篇
  • 10. 异常处理器
  • 【某农业大学计算机网络实验报告】实验二 交换机的自学习算法
  • Python小程序 - 替换文件内容
  • Redis Search系列 - 第四讲 支持中文