所谓扁平化就是将一个多维数组转变成一维数组,可用于单个接口多场景下的数据处理。
例如,某接口返回一个二维数组的category数据,0下标下是收入分类,1下标下是支出分类。这个数据在记账页面上可以直接用于收入和支出两个局部模块,但在列表页下需要将两个数据进行一个合并处理。这时就需要到扁平化的概念。
递归
Array.prototype.flat = function(arr){
//使用map遍历并拷贝响应结果
let result = arr.map((item)=>{
if(Array.isArray(item)){
//递归数组,达到降维的作用
return flat(item)
}else{
//返回普通元素,构成一维数组
return item;
}
})
//result值因为递归的原因最高只有二维,那么使用...解构就能得到多个元素和一维数组;concant方法接收单个元素或数组,那么最后就能返回一个一维数组啦
return [].concat(...result);
}
不使用concat进行扁平化:
concat是接收一个值或数组进行浅拷贝,那么我们再写一个能接收多个参数进行push的函数就行了
/**
* @description 拷贝n个数组或value
* @params {*} valArr n个数组或value
**/
function pushVal(...valArr){
let res =[];
for(val of valArr){
if(Array.isArray(val)){
for(i of val){
res.push(i);
}
}else{
res.push(val);
}
}
return res;
}
当然js在数组原型上实现了flat方法,所以平时的时候可以使用
Array.prototype.flat(infinite)