JS数组相关(二)
数组的扁平化
数组扁平化就是将多维数组变成一维数组的过程。
这里的讨论我们分成两种情况吧:一种是数组元素是数字,另一种是数组包含多种数据类型。
数字数组
1、toString + split
let arr = [1, 2, 3, [4, 5, [6]]];
let str = arr.toString().split(',').map(item => parseInt(item));
console.log(str); // [1, 2, 3, 4, 5, 6]
数组执行toString()方法会为每个元素执行toString,使其转化为字符串。
2、join + split
let arr = [1, 2, 3, [4, 5, [6]]];
let str = arr.join(',').split(',').map(item => parseInt(item))
console.log(str); // [1, 2, 3, 4, 5, 6]
通用方法
1、flat()方法(ES6方法)
flat()方法可以指定深度,默认深度为1,传Infinity表示彻底扁平化。无视数据类型。
let arr = [1, 2, 3, [4, {name: 'aa'}, [6]]];
let str = arr.flat(Infinity);
console.log(str); // [1, 2, 3, 4, {name: 'aa'}, 6]
2、借用正则方法
可以先借用JSON.stringify将数组转换为字符串,然后通过正则匹配去掉‘[’和‘]’。
let arr = [1, 2, 3, [4, {name: 'aa'}, [6]]];
let str = JSON.stringify(arr);
str = str.replace(/(\[|\])/g, '')
str = `[${str}]`
str = JSON.parse(str)
console.log(str)
此处需要注意,正则匹配去掉'[',']'之后,即第三步,不可以直接用使用split()方法将字符串转成数组,那样做会导致数组中的数字变成字符,改变了数据类型。
3、使用for循环递归
循环递归的思路就是,判断数组的每一项是不是数组,如果不是数组,就把该项加到新数组里,如果是数组就递归执行。
function arrayFlat(arr) {
let result = [];
let f = function(arr){
for(let i = 0; i < arr.length; i++) {
if(Array.isArray(arr[i])) {
f(arr[i]);
} else {
result.push(arr[i])
}
}
}
f(arr)
return result;
}
4、借助reduce方法
function arrayFlat(arr) {
let f = function(arr) {
return arr.reduce((prev, cur) =>{
if(Array.isArray(cur)) {
return [...prev, ...f(cur)]
} else {
return [...prev, cur]
}
}, [])
}
return f(arr)
}

浙公网安备 33010602011771号