JS中数组扁平化处理方式
在项目开发中,经常会用到数组的操作,今天,整理一下数组的扁平化处理
const arr = [1,2,[3,4,5,[6,7],8],9,10,[11,[12,13]]];
方式一 采用ES2019新增属性,flat()方式,接收参数dept 需要扁平的层级,只能在支持 ES6 的浏览器或者环境中使用
console.log(arr.flat())//[1, 2, 3, 4, 5, [6, 7], 8, 9, 10, 11, [12, 13]]
console.log(arr.flat(3))//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
方式二 采用toString() /join()方法把数组转成成字符串,然后再以,隔开,然后遍历把字符串数组转化为数字类型
console.log(arr.toString().split(',').map(item=>Number(item))) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
console.log(arr.join(',').split(',').map(item=>Number(item)))//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
方式三 采用递归的方式,通过Array.isArray判断是否是数组,继续遍历调用下层,直到不是数组为止
function bpArr(arr){
let newarr=[]
arr.map(item=>{
if(Array.isArray(item)){
// newarr=newarr.concat(bpArr(item))
newarr=[...newarr,...bpArr(item)]
}else{
newarr.push(item)
}
})
return newarr
}
console.log(bpArr(arr)) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
方式四 reduce 方法进行数组扁平化处理
function flatten(arr) {
return arr.reduce((acc, item) => {
if (Array.isArray(item)) {
return acc.concat(flatten(item));
} else {
return acc.concat(item);
}
}, []);
}
方案五 迭代器实现数组扁平化,使用生成器函数将嵌套的数组转换为迭代器对象,然后使用 for...of 循环或者 Array.from() 方法将迭代器对象转换为一维数组
function* flatten(arr) {
for (let item of arr) {
if (Array.isArray(item)) {
yield* flatten(item);
} else {
yield item;
}
}
}
const arr = [1, 2, [3, 4, [5, 6]]];
const flat = [];
for (let item of flatten(arr)) {
flat.push(item);
}
console.log(flat); // [1, 2, 3, 4, 5, 6]
// 使用 Array.from() 方法
const arr = [1, 2, [3, 4, [5, 6]]];
const flat = Array.from(flatten(arr));
console.log(flat); // [1, 2, 3, 4, 5, 6]
方案六 ES6 的展开运算符进行数组扁平化处理
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}