数组扁平化问题描述
数据扁平化,指把多维数组变成一维数组
即原始数组:[1,[2,[3,[4,5]]]]
经过扁平化后:[1,2,3,4,5]
数组扁平化的具体方法
数组扁平化实现起来并不复杂,涉及很简单的算法,还可以通过一些JS数组自带的方法实现
使用flat方法实现数组扁平化
- Array.flat(depth)
- depth参数可选,默认为1,表示数组扁平化的层数,设为Infinity则为完全展开
-
const arr = ['a' , 'b', 'c', ['d','e'], ['f', [ 'g', 'h']]]; console.log(arr.flat()); ['a','b','c','d','e','f',['g','h']] const arr = ['a' , 'b', 'c', ['d','e'], ['f', [ 'g', 'h']]]; console.log(arr.flat(2)); ['a','b','c','d','e','f','g','h']
因此使用flat实现扁平化的方法为:
const arr = [1,[2,[3,[4,5]]]];
console.log( arr.flat(Infinity) );
使用递归方法实现数组扁平化
- Array.concat()方法
- 该方法可以把数组连接
-
console.log( [1,2].concat([3,[4,5]]) ); [1,2,3,[4,5]]
- Array.isArray()方法
- 判断输入的元素是否是Array
使用递归方法实现数组扁平化:
要注意:因为Array.concat方法不会改变原来的数组,因此需要进行赋值操作,否则会得到不正确的结果
const arr = [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{
result.push(arr[i]);
}
}
return result;
}
console.log( flatten(arr) );
复杂度分析:
O(n)
其中n为扁平后一维数组的元素个数
使用reduce方法实现数组扁平化
- Array.reduce()
- 该方法的输入有两个参数,第一个参数是函数,第二个参数可选,为初始值
- 第一个参数:该函数有四个形参,但是通常只用前两个 pre,cur
- pre为上一次函数执行返回的结果
- cur为当前遍历到的数组元素
- 第二个参数:如果不填,则pre默认从数组第一个元素开始,cur为第二个,
- 如果有参数,则pre为参数,cur为数组第一个元素
具体的实现方法:
const arr = [1,[2,[3,[4,5]]]];
function flatten(arr){
return arr.reduce(
(pre,cur)=>{
return pre.concat( Array.isArray(cur)?flatten(cur):cur );
}
,[]);
}
console.log( flatten(arr) );
使用Array.toString()和String.split()方式实现数组扁平化
- Array.toString()
- 可以把数组转换成字符串
- 具体的转换效果:
-
const arr = [1,[2,[3,[4,5]]]]; console.log( arr.toString() ); "1,2,3,4,5"
- String.split()
- 可以把字符串拆分成数组
- 不填的话默认是整个字符串是数组的一个元素,填写的话就会按分隔符拆分
- 这种方法的问题是,拆分后,数组的每一个元素是字符,而不是数字了
具体实现方法:
const arr = [1,[2,[3,[4,5]]]];
console.log( arr.toString().split(",") );