定义
在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) 使用正则
- 首先是使用 JSON.stringify 把 arr 转为字符串
- 接着使用正则把字符串里面的 [ 和 ] 去掉
- 然后再拼接数组括号转为数组对象
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
方法的第一个参数是一个回调函数,这个回调函数有两个参数:pre
和 cur
。pre
是累加器的值,即上一次回调函数返回的结果;cur
是当前正在处理的数组元素。
return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)
:
这是 reduce
方法回调函数的主体部分。它首先检查当前元素 cur
是否是一个数组。如果是数组,那么递归调用 newArr
函数来处理这个子数组,并将结果与 pre
进行 concat
操作,即合并两个数组。如果不是数组,就直接将 cur
与 pre
进行 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。