在我们写算法,或者面试的时候,我们经常会见到数组扁平化,今天我们就来介绍一下什么是数组扁平化以及常用的几种数组扁平化方法。
数组扁平化
什么是数组扁平化
[1,2,3,4,5,6]这是一维数组
[1,2,[3,4],5,[6,7,[8,9]]]这是多维数组
将多维数组转化为一维数组的过程就是数组扁平化。
数组怎么扁平化
接下来我们一起来看看如何将数组扁平化。总结为四种方法,递归法,暴力法,字符转化法,使用ES6提供的新方法。
1.递归法
let arr = [1, [2, 3],
[4, [5, 6]]
];
var res = [];
function fla(arr) {
arr.map(item => {
if (Array.isArray(item)) {
fla(item);
} else {
res.push(item);
}
});
return res;
}
fla(arr);
console.log(res); //[1,2,3,4,5,6]
在递归函数中设置条件,如果传入的元素依旧是数组就进行下一次递归,如果不是就将该元素push到目标数组里,因为使用递归多次执行函数,故效率较低。
2.暴力法
let arr = [1, [2, 3],
[4, [5, 6]]
];
function flatten(input) {
const stack = [...input]; //保证不会破坏原数组
const result = [];
while (stack.length) {
const first = stack.shift();
if (Array.isArray(first)) {
stack.unshift(...first);
} else {
result.push(first);
}
}
return result;
}
let res = flatten(arr);
console.log(res);
在循环开始前创建了新数组,以保证原数组的元素不被破坏,循环中进行判断,如果一个元素是数组,就把它使用拓展运算符解构,如果不是数组就将其push到目标数组。
3.字符转化法
toString()和split()
let arr = [1, [2, 3],
[4, [5, 6]]
];
let res = [];
function fla(arr) {
arr = arr.toString().split(',').map(item => Number(item));
return arr;
}
res = fla(arr);
console.log(res);
join()和split()
let arr = [1, [2, 3],
[4, [5, 6]]
];
let res = arr.join(',').split(',').map(item => Number(item));
console.log(res);
上面的两种方法都是将原数组转化为字符形式再次转化回来得到的,转化为字符形式后转化为数组必须使用方法(字符转数字)才可以成为数字数组。
ES6提供的新方法
拓展运算符(…)
let arr = [1, [2, 3],
[4, [5, 6]]
];
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
};
return arr;
}
let res = flatten(arr);
console.log(res);
扩展运算符可以展开数组,代替apply()将数组转化为函数参数的需求。
flat()方法
let arr = [1, [2, 3],
[4, [5, 6]]
];
console.log(arr.flat(Infinity));
还有一种
flatmap()方法类似于数组的map()方法,所以在这里不进行介绍,使用其也可以进行数组扁平化。
以上就是常用的数组扁平化的方法。
有关于各种方法的优化方面,可以去看看这位大佬的博客数组扁平化详解。