数组的扁平化处理 即多维数组转化为一维数组;
首先第一种: reduce+递归;
reduce是数组的一种方法,它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce包含两个参数:回调函数,传给total的初始值
let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];
const flatten = arr1 => arr1.reduce(
(acc,val) => acc.concat(Array.isArray(val)? flatten(val):val),[]
)
console.log(flatten(arr1));
第二种:toString().split(',')
这个就比较粗暴了 不过返回值会变成string类型 若是要求数据类型可以在遍历一次强转number;
let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];
function changeArrType(arr1){
let arr2 = arr1.toString().split(',');
//let arr2 = arr1.join(',').split(','); join也可以实现
let newArr = arr2.map((item)=>{ //map方法转number类型 根据自己需要处理
return Number(item)
})
return newArr;
}
console.log(changeArrType(arr1))
第三种: 递归实现
遍历每一项,判断是不是数组,是数组就把这项取出来再遍历;
let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];
let newArr1 = [];
function oneDimensionalArray(arr){
for(let i=0;i
if(Array.isArray(arr[i])){
oneDimensionalArray(arr[i])
}else{
newArr1.push(arr[i]);
}
}
}
oneDimensionalArray(arr1);
console.log(newArr1);
第四种:ES6的flat方法
首先flat()默认只会“拉平”一层
let arr = [1,2,[,4,5]]
console.log(arr.flat())
如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数
let arr = [1,2,[3,4,[5,6]]]
let arr1 = [1,2,[3,4,[5,6,[7,8]]]]
console.log(arr.flat(2),arr1.flat(3))
那么对于不知道急几层嵌套的该怎么办? 细心的同学可以发现 上面的例子中的arr拉伸时
我们传入只要大于2的数字就可以把数组完全拉伸开(arr1的参数需要>=3)。那么问题就好解决了
用Infinity 作为关键字 有兴趣的小伙伴可以去看看实现的代码
let arr = [1,2,3,4,5,[6,7,[8,9,[10,11,[12,13]]]]];
console.log(arr.flat(Infinity))
第五种:扩展运算符
es6的扩展运算符能将二维数组变为一维
[].concat(...[1, 2, [3,4,5]]);
根据这个我们可以自己封装个遍历方法,若arr中含有数组则使用一次扩展运算符,直至没有为止,其思想和第三种一样
let arr1 = [1,2,3,4,5,[6,7,[8,9,[10,11,[12,13]]]]];
function flatten(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatten(arr1))
总结:
上述我们一共说了几种方法,仔细发现他们实现的核心都是通过遍历,判断每项是不是数组,
然后通过concat或者新建空数组来拼接或者保存
标签:flat,arr,console,扁平化,数组,几种,let,arr1
来源: https://blog.csdn.net/weixin_47975113/article/details/106801363