数组扁平化,就是将多维数组变成一维数组:
[1, [2, 3, [4, 5]]] ---> [1, 2, 3, 4, 5]
如何实现呢?
最简单的方案是利用reduce,先复习下这个函数:
arr.reduce(callback,[initialValue])
/*
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
*/
给定初始值initialValue为[], 用previousValue来concat合并currentValue:
let arr = [1, [2, 3, [4, 5]]]
function flatten(arr) {
return arr.reduce((previousValue, currentValue)=> {
return previousValue.concat(currentValue);
}, []);
}
let newarr = flatten(arr)
console.log(newarr)
这样可以吗?看一下执行结果:
[ 1, 2, 3, [ 4, 5 ] ]
有点问题,二维数组可以扁平化为一维,但三维的只能扁平化为二维,扁平化的不彻底,怎么办呢?
很简单,判断当前元素currentValue是数组时,让他递归。
let arr = [1, [2, 3, [4, 5]]]
function flatten(arr) {
return arr.reduce((previousValue, currentValue)=> {
if(Array.isArray(currentValue)){
return previousValue.concat(flatten(currentValue))
} else {
return previousValue.concat(currentValue)
}
}, []);
}
let newarr = flatten(arr)
console.log(newarr)
代码看着有点啰嗦,我们用三元运算符改一下:
let arr = [1, [2, 3, [4, 5]]]
function flatten(arr) {
return arr.reduce((previousValue, currentValue)=> {
return previousValue.concat(Array.isArray(currentValue)? flatten(currentValue): currentValue)
}, []);
}
let newarr = flatten(arr)
console.log(newarr)
网友评论