reduce的常见用法与拍平数字方法flat的实现

231 阅读1分钟

一.reduce常见用法 参考链接:www.jianshu.com/p/e375ba1cf…

reduce的常见用法有:

  • 1.数组求和,求乘积
  • 2.求数组每个相同元素的个数
  • 3.数组去重
  • 4.求对象的属性和
  • 5.拍平数组(见下面)

二.flat的实现

flat的基本用法:

  • 1.无参数时默认拉平一层
  • 2.有参数时,flat(2)拉平两层
  • 3.参数为infinity时,全部拉平
  • 4.参数小于等于零时,返回原数组
  • 5.如果数组中有空位,会跳过空位 参考链接:segmentfault.com/a/119000002…

注意主要使用方法4,使用reduce来实现flat 数组扁平化

1. 递归 + Array.isArray判断

let arr = [1,2,[3,4],[[5,6]]]
function flatten(arr) {
  let res = []
  arr.forEach((value, index) => {
    if(Array.isArray(value)) {
      res = res.concat(flatten(value))
    } else {
      res.push(value)
    }
  })
  return res
}
console.log(flatten(arr))

2. 高阶函数 reduce 实现

function flatten(arr) {
   return arr.reduce((pre, cur) => {
     return pre.concat(Array.isArray(cur) ? flatten(cur) : cur)
   }, [])
} 
console.log(flatten(arr))

3.Array.prototype.flat(Infinity)

let arr = [1,2,[3,4],[[5,6]]]
console.log(arr.flat(Infinity))

4.高阶函数 some 实现

some 用来判断数组中是否还有数组元素,只要还有一个数组元素,就会返回 true;展开字符每次只能展开数组的一层,比如...[1,[2, [3]]]转换成[1,2,[3]],所以需要循环用 some 判断是否已展开到最后一层。

function flatten(arr) {
   while(arr.some(item => Array.isArray(item))) {
     arr = [].concat(...arr)
   }
   return arr
} 
console.log(flatten(arr))