普通的递归思路很容易理解,就是通过循环递归的方式,一项一项地去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,来实现数组的每一项的连接:
let arr = [1,[2,3,[4]]];
function flatten(arr){
let newArr = [];
//这里得用of不能用in,用in遍历出来的item是数组下标,得注意
for(let item of arr){
console.log(item);
//Array.isArray()是一个安全的函数
if(Array.isArray(item)){
//concat函数返回一个新数组
newArr = newArr.concat(flatten(item));
}else {
newArr.push(item);
}
}
return newArr;
}
console.log(flatten(arr));
let arr = [1,[2,3,[4]]];
function flatten(arr){
return arr.reduce(function(pre,current){
return pre.concat(Array.isArray(current) ? flatten(current) : current)
},[])
}
console.log(flatten(arr));
这个方法的实现,采用了扩展运算符和 some 的方法,两者共同使用,达到数组扁平化的目的,个人认为此方法是最酷的,能够给面试官一个惊喜
let arr = [1,[2,[3,4]]];
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
console.log(arr);
arr = [].concat(...arr)
}
return arr;
}
console.log(flatten(arr));
可以通过 split 和 toString 两个方法来共同实现数组扁平化,由于数组会默认带一个 toString 的方法,所以可以把数组直接转换成逗号分隔的字符串,然后再用 split 方法把字符串重新转换为数组
let arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.toString().split(',');
}
console.log(flatten(arr)); // [1, 2, 3, 4,5]
我们还可以直接调用 ES6 中的 flat 方法来实现数组扁平化。flat 方法的语法:arr.flat([depth])
其中 depth 是 flat 的参数,depth 是可以传递数组的展开深度(默认不填、数值是 1),即展开一层数组。如果层数不确定,参数可以传进 Infinity,代表不论多少层都要展开:
let arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.flat(Infinity);
}
console.log(flatten(arr)); // [1, 2, 3, 4,5]
(6)正则和 JSON 方法 在第4种方法中已经使用 toString 方法,其中仍然采用了将 JSON.stringify 的方法先转换为字符串,然后通过正则表达式过滤掉字符串中的数组的方括号,最后再利用 JSON.parse 把它转换成数组:
let arr = [1, [2, [3, [4, 5]]], 6];
function flatten(arr) {
let str = JSON.stringify(arr);
console.log(str);//[1,[2,[3,[4,5]]],6],字符串
str = str.replace(/(\[|\])/g, '');
console.log(str);//1,2,3,4,5,6
str = '[' + str + ']';
console.log(str);//[1,2,3,4,5,6]
return JSON.parse(str);
}
console.log(flatten(arr)); // [1, 2, 3, 4,5]