js-读书笔记-函数式编程-递归-flat

import _ from 'underScore'
// 递归和组合函数 conjoin Disjoin 
// flat 的实现

// 互相关系的函数
// 两个或多个函数互相调用被称为互相递归

function even(n) {
  if(n === 0) {
    return true
  } else {
    return odd(Math.abs(n) - 1)
  }
}
function odd(n) {
  if(n === 0) {
    return false
  } else {
    return even(Math.abs(n) - 1)
  }
}
console.log(even(4)) // true
console.log(even(11)) // false
console.log(odd(11)) // true
console.log(odd(12)) // false

/* 无限展平-原生版 */
// 步骤:是数组,展平后自调用函数
// 终止条件:不是数组,返回数组
// function flatEs5(ary) {
//   if(Array.isArray(ary)) {
//     // 取出来一个,然后将剩下的拿出来做数组合并,从而消除数组
//     return Utils.cat.apply(Utils.cat, ary.map(flatEs5))
//   } else {
//     // 做成所有子元素都是数组的形式,方便后面用数组合并统一处理。
//     return [ary]
//   }
// }

function flatEs5(ary) {
  if(Array.isArray(ary)) {
    let [head, ...rest] = ary.map(flatEs5)
    return head.concat.apply(head, rest)
  } else {
    return [ary]
  }
}

/* 无限展平-es6版 */
// function flatEs6(ary) {
//   if(Array.isArray(ary)) {
//     return ary.map(flatEs6).flat()
//   } else {
//     return [ary]
//   }
// }

function flatEs6(ary) {
  return Array.isArray(ary) ? ary.map(flatEs6).flat() : [ary]
}

/* 无限展平-es6-reduce版 */
function flatEs6Reduce(ary) {
  return ary.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur)?flatEs6Reduce(cur):cur)
  }, [])
}

console.log(flatEs5([[1,2,3], [3,4]]))
// console.log(flatEs5([[1,2], [3,4, [5,6, [7,8]]]]))

// console.log(flatEs6Reduce([[1,2,3], [3,4]]))
// console.log(flatEs6Reduce([[1,2], [3,4, [5,6, [7,8]]]]))
// console.log(flatEs6([[1,2], [3,4, [5,6, [7,8]]]]))



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值