数组扁平化指的是将多维数组转换为一维数组,实现的思路包含以下几种:
拼接+递归
拼接指的是新建一个空数组作为结果数组,将原数组进行分析变换后拼接到新数组上,最终返回新数组。
递归指的是由于不知道多维数组嵌套有多少层,所以对原数组采用递归的分析方式来解决。
通用的方式
function flatten(arr) {
let result = [];
// 遍历数组元素,查看元素是否为数组类型
for (let i = 0; i < arr.length; i ++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
// 注意这里不能用result.concat, 因为该方法不能改变result原数组
result.push(arr[i]);
}
}
return result;
}
使用reduce简化
function flatten(arr) {
return arr.reduce((accu, item) => {
return accu.concat(Array.isArray(item)? flatten(item): item);
}, [])
}
使用…扩展运算符
function flatten(arr) {
while (arr.some((item) => {
Array.isArray(item)
})) {
// 扩展运算符传入concat函数中,一层一层剥离多维数组
arr = [].concat(...arr);
}
return arr;
}
使用toString方法
数组的toString方法将多维数组的各项元素转换为逗号分隔的字符串,然后再用split方法把字符串转换为数组。(注意:该方法会让数组元素为对象类型或其他非数组类型且调用toString返回’object Object‘
,因而影响最终的结果)
// 方法4
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.toString().split(',');
}
console.log(flatten(arr)); // [1, 2, 3, 4]
使用ES6原生提供的flat方法
语法:Array.prototype.flat([depth])
其中,depth为可选参数,默认为1,表示展开深度,默认只展开一层。如果想要彻底展开,则传入Infinity即可。
function flatten(arr) {
return arr.flat(Infinity);
}
使用JSON+正则
function flatten(arr) {
// 转为JSON字符串
let str = JSON.stringify(arr);
// 替换掉[和]
str = str.replace(/(\[|\])/g, '');
str = '[' + str + ']';
// 解析为对象
return JSON.parse(str);
}