ES6中的flat
const arr = [1,2,[3,[4,5]],6]
console.log(arr.flat(Infinity)) // [1,2,3,4,5,6]
递归
const arr = [1,2,3,[4,[5,6]],7]
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)) // [1,2,3,4,5,6,7]
reduce函数迭代
arr.reduce(callback,[initalValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
(没有initialValue,previousValue就是索引为0的那个值,currentValue就从索引为1开始)
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
const arr = [1,2,3,[4,[5,6]],7]
function flatten(arr){
return arr.reduce((pre,cur)=>{
return pre.concat(Array.isArray(cur) ? flatten(cur):cur)
},[]) //传递初始值空数组[],就会从数组索引为0的元素开始执行
}
console.log(flatten(arr)) // [1,2,3,4,5,6,7]
执行过程:
- 第一次执行,初始值传入[],走到reduce的回调里,参数pre就是[],参数cur就是数组的第一项1,回调内[].concat(1)
- 第二次执行,reduce的回调参数pre是上一次回调执行的结果1,继续用它来concat数组的第二项2,得到结果[1,2]作为下一次回调执行的参数pre继续执行下去
- 。。。以此类推