js-读书笔记-函数式编程-无类编程-函数式编程链

import _, { collect, first } from 'underScore'
import Utils from '../lib/utils.js'
function LazyChain(obj) {
  let calls = []
  return {
    invoke(methodName, ...args) {
      calls.push(target => {
        let meth = target[methodName]
        return meth.apply(target, args)
      })
      return this
    },
    force: () => calls.reduce((ret, thunk) => thunk(ret), obj)
  }
}
console.log(LazyChain([2,1,3]).invoke('concat', [7,7,8,9,0]).invoke('sort').force())
/* 
[
  0, 1, 2, 3,
  7, 7, 8, 9 
]
*/

function deferredSort(ary) { // 惰性排序
  return LazyChain(ary).invoke('sort')
}
function force(thunk) {
  return thunk.force()
}

// 多链
const deferredSorts = [[2,1,3], [7,7,1], [0, 9, 5]].map(deferredSort)

// 多链批量执行
console.log('deferredSorts.map(force)', deferredSorts.map(force))
// deferredSorts.map(force) [ [ 1, 2, 3 ], [ 1, 7, 7 ], [ 0, 5, 9 ] ]

// 验证子元素长度是否为3
const validateTriples = Utils.validator(
  'Each array should have three elements',
  arrays => arrays.every(a => a.length === 3)
)

const validateTripleStore = Utils.partial(Utils.condition(validateTriples), _.identity)

console.log('validateTripleStore', validateTripleStore([[2,1,3], [7,7,1], [0, 9, 5]]))
// validateTripleStore [ [ 2, 1, 3 ], [ 7, 7, 1 ], [ 0, 9, 5 ] ]

// 取第二个值
const second = (ary) => ary[1]

// 子元素批量取第二个值
const postProcess = (ary) => {
  return ary.map(second)
}

function processTriples(data) {
  return Utils.pipeline(data
    ,JSON.parse
    ,validateTripleStore
    ,deferredSort
    ,force
    ,postProcess
    ,Utils.invoker('sort', Array.prototype.sort)
  )
}

console.log('processTriples', processTriples("[[2,1,3], [7,7,1], [0, 9, 5]]"))
// processTriples [ 1, 7, 9 ]

// JSON.stringify([1,2,[3,4]]) 的两种实现
// 1. 互相函数写法
function polyToString(obj) {
  if (obj instanceof String) { // 终止条件
    return obj
  } else if (obj instanceof Array) { // 互换条件
    return stringifyArray(obj)
  }
  return obj.toString() // 求值
}
function stringifyArray(ary) {
  return ["[", ary.map(polyToString).join(',') ,"]"].join('')
}

console.log(
  polyToString([1,2,3]),
  polyToString([1,2, {a: 42, b: [4,5,6]}, 77]),
  polyToString([1,2,[3,4]])
)
console.log(JSON.stringify([1,2,[3,4]]))


// 2. 函数式编程写法
let polyToStringNew = Utils.dispatch(
  s => _.isString(s) ? s : undefined,
  s => _.isArray(s) ? stringifyArray(s) : undefined,
  s => _.isObject(s) ? JSON.stringify(s) : undefined,
  s => s.toString(),
)

console.log( polyToStringNew([1,2, {a: 42, b: [4,5,6]}, 77]) )
console.log( polyToStringNew([1,2,[3,4]]) )








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值