数组扁平化概念:
数组扁平化是指将一个多维数组变为一维数组。
[1,[2,[3,[4,5,[6,7,[8,9],10],11],12,13],14] -------->
实现:
1.reduce
遍历数组每一项,若值为数组则递归遍历,否则cancat。
function flatten(arr){
return arr.reduce((result,item)=>{
return result.concat(Array.isArray(item)? flatten(item) : item )
},[])
}
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
total 必需。初始值, 或者计算结束后的返回值。
currentValue 必需。当前元素
currentIndex 可选。当前元素的索引
arr 可选。当前元素所属的数组对象。
initialValue 可选。传递给函数的初始值
reduce 是数组的一种方式,它接收一个函数作为累加器,数组中的每一个值(从左到右)开始缩减,最终计算为一个值。
reduce包含两个参数,回调函数,传给total的初始值。
//求数组的各项值相加的和
arr.reduce((total,item)=>{return total+item},0) //total为之前的计算结果,item为数组的各项值。
2. toString & split
调用数组的toString 方法,将数组变为字符串然后再用split分割还原数组。
function flatten(arr){
return arr.toString().split(',').map(item=> return Number(item))
}
因为split分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型。
3. join & split
和上面的toString一样,join也可以将数组转换为字符串
function flatten(arr){
return arr.join(',').split(',').map((item)=>{
return parseInt(item)
})
}
4. 递归
递归的是遍历每一项,若是数组则继续遍历,否则concat
function flatten(arr){
const res = []
arr.map(item=>{
if(Array.isArray(item)){
res = res.concat(flatten(item))
}else{
res = res.push(item)
}
})
return res;
}
5.扩展运算符
es6的扩展运算符能将二维数组变为一维
[].concat(...[1, 2, 3, [4, 5]]); // [1, 2, 3, 4, 5]
根据这个结果我们可以做一个遍历,若arr 中含有数组则使用一次扩展运算符,直至没有为止
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr)
}
return arr;
}
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。