数组扁平化

定义

在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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上一篇:WebGl 缩放矩阵


下一篇:Java 解决阿里云OSS服务器私有权限图片通过URL无法预览的问题