数组扁平化是指将一个多维数组变为一个一维数组
解决方案:
1.flat()函数
-
函数提供了将一组数组项串联成一个全新的数组并在函数完成后返回新数组的能力。由于这个函数产生了一个全新的数组,所以一旦函数完成操作后,任何包含在原始数组中的现有的、完全独立的数组都不会被改变。
-
flat(深度) 函数仅采用一个参数即深度,该参数是可选的。如果原始数组包含一个或多个嵌套数组结构,则此参数决定函数将多少数组层压扁为单个层。由于该参数是可选的,所以它的默认值为 1,并且在函数完成时,只有单层数组将被平展到返回的全新数组中。
-
flat()与 flat(1) 相同。意味着原始数组中深度为 1 的任何数组都将被完全展平,以便将其所有内容单独连接到新数组。
负深度
var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(-Infinity);
// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]
负深度值对于扁平嵌套数组没有意义,在指定负深度参数值的情况下,将使用 0 作为替代。
零深度
var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(0);
// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]
这意味着原始数组中包含的任何数组都不会被展平,并且新数组的单个数组项和嵌套数组的组成与原始数组完全相同。
没有参数
var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat();
// array2: [1, 2, 3, 4, [5, 6], [[7, 8]], [[[9, 10]]]]
正深度
var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(2);
// array2: [1, 2, 3, 4, 5, 6, [7, 8], [[9, 10]]]
无限深度
var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(Infinity);
// array2: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- flat()函数可以移除空项
const arr=[1,[2,[3,[4,5]]], ,6]
const r1=arr.flat(Infinity)
// r1: [1, 2, 3, 4, 5, 6,]
2.利用正则
但数据类型都会变为字符串
- JSON.stringify()作用是将json数组转换成字符串
- replace(/[|]/g,’’)中使用了正则表达式将所有的[ ]一次性替换掉。replace(/被替换对象/g,‘替换对象’)
匹配 [,使用\ [。
const arr=[1,[2,[3,[4,5]]],6]
const r1=JSON.stringify(arr).replace(/\[|\]/g,'').split(',')
console.log(r1)
3.正则改良版
- JSON.parse()作用是将字符串转化成json数组
const arr=[1,[2,[3,[4,5]]],6]
const r1=JSON.parse('['+JSON.stringify(arr).replace(/\[|\]/g,'').split(',')+']')
console.log(r1)
//ri:[1,2,3,4,5,6]
4.使用reduce()函数
reduce() 函数会对参数序列中元素进行累积。
reduce(function, iterable[, initializer])
function – 函数,有两个参数
iterable – 可迭代对象
initializer – 可选,初始参数
const arr=[1,[2,[3,[4,5]]],6]
const r1=arr => {
return arr.reduce(
(pre,cur)=>{
//判断是否是数组,是,则返回r1(cur)再次进行判断;否,则直接输出cur
return pre.concat(Array.isArray(cur)?r1(cur):cur)
}
,[])
}
const r2=r1(arr)
console.log(r2)
//r2:[1,2,3,4,5,6]
- Array.isArray() 用于确定传递的值是否是一个 Array。如果值是 Array,则为true; 否则为false。
- concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
5.函数递归
const arr=[1,[2,[3,[4,5]]],6]
const r1=[]
const r2=arr=>{
for(let i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
r2(arr[i])
}else{
r1.push(arr[i])
}
}
}
r2(arr)
console.log(r1)
//r1:[1,2,3,4,5,6]
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。