实现数组扁平化的6种方式。
问题1:
怎样用最普通的方法解决数组扁平化问题?问题2:
ES6 里面是否有一些高级的方法能够直接实现?扁平化的实现
定义:将一个嵌套多层的数组array(嵌套可以是任何层数)转换为只有一层的数组
方法一:普通的递归实现
通过循环递归的方式,一项一项地去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,来实现数组的每一项的连接
// 方法1
var a = [1,[2,[3,4,5]]];
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 {
reslut.push(arr[i]);
}
}
return result;
}
flatten(a); // [1,2,3,4,5]
方法二:利用 reduce 函数迭代
从上面普通的递归函数中可以看出,其实就是对数组的每一项进行处理,简化第一种方法的代码
// 方法2
var a = [1,[2,[3,4,5]]];
function flatten(arr) {
return arr.reduce(function(prev,next){
return prev.concat(Array.isArray(next) ? flatten(next) : next)
},[])
}
console.log(flatten(a)); // [1,2,3,4,5]
方法三:扩展运算符实现
// 方法3
var arr = [1,[2,[3,4]]];
function flatten(arr){
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatten(arr)); // [1,2,3,4,5]
前三种实现数组扁平化的方式是最基本的思路,都是通过最普遍递归思路衍生的方法
方法四:split 和 toString 共同处理
// 方法4
var arr = [1,[2,[3,4]]];
function flatten(arr) {
return arr.toString().split(',');
}
console.log(flatten(arr)); // [1,2,3,4,5]
方法五:调用 ES6 中的 flat
直接调用 ES6 中的 flat 方法,可以直接实现数组扁平化
arr.flat([depth])
// 方法5
var arr = [1,[2,[3,4]]];
function flatten(arr) {
return arr.flat(Infinity);
}
console.log(flatten(arr)); // [1,2,3,4,5]
方法六:正则和 JSON 方法共同处理
// 方法 6
let arr = [1,[2,[3,4]]];
function flatten(arr) {
let str = JSON.stringfy(arr);
str = str.replace(/(\[|\])/g,'');
str = '[' + str + ']';
return JSON.parse(str);
}
console.log(flatten(arr)); // [1,2,3,4,5]
总结
方法/问题 | 实现难度 | 编码思路 |
---|---|---|
递归思路 | 易 | 递归实现,返回新数组 |
reduce实现 | 中 | reduce进行累加操作 |
扩展运算符实现 | 中 | 筛选出数组项进行连接 |
split和toString | 易 | 转成字符串在转数组 |
flat方法 | 易 | 特定功能方法直接操作 |
正则和JSON方法 | 中 | JSON方法转成字符串转回过程中正则处理 |