Module: chaining

Classes

Functions

chain

chain(v): FuncJS<any>

显式开启func.js的函数链,返回一个包裹了参数v的Func链式对象。

函数链使用惰性计算 —— 直到显示调用value()方法时,函数链才会进行计算并返回结果

Example

//3-5console.log(_([1,2,3,4]).map(v=>v+1).filter(v=>v%2!==0).take(2).join('-').value())

Parameters

NameType
vany

Returns

FuncJS<any>

func.js对象


default

default(v): FuncJS<any>

返回一个包裹了参数v的func.js对象,并隐式开始函数链。函数链可以链接func.js提供的所有函数,如

_([1,2,3,4]).map(v=>v+1).filter(v=>v%2===0).take(2).join('-').value()

函数链与直接调用方法的区别不仅在于可以链式调用,更在于函数链是基于惰性求值的。 上式中必须通过显式调用value()方法才能获取结果, 而只有在value()方法调用时整个函数链才进行求值。

惰性求值允许func.js实现捷径融合(shortcut fusion) —— 一项基于已有函数对数组循环次数进行大幅减少以提升性能的优化技术。 下面的例子演示了原生函数链和func.js函数链的性能差异

Example

let ary = _.range(20000000);console.time('native');let c = 0;let a = ary.map((v)=>{   c++;   return v+1; }).filter((v) => {   c++;   return v%2==0; }) .reverse() .slice(1, 4)console.timeEnd('native');console.log(a, c, '次');//大约600ms左右,循环 40000000 次//func.jsary = _.range(20000000);console.time('func.js');let x = 0;let targets = _(ary) .map((v) => {   x++;   return v+1; }) .filter((v) => {   x++;   return v%2==0; }) .reverse() .slice(1, 4) .value();console.timeEnd('func.js');console.log(targets, x, '次');//大约0.5ms左右,循环 18 次

Parameters

NameType
vany

Returns

FuncJS<any>

func.js对象


mixin

mixin(obj): void

为func.js扩展额外函数,扩展后的函数同样具有函数链访问能力

Example

//增加扩展_.mixin({ select:_.get, from:_.chain, where:_.filter, top:_.head});const libs = [ {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true}, {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false}, {name:'soya2d',platform:['web'],tags:{utils:true},js:true}];//查询utils是true的第一行数据的name值console.log(_.from(libs).where({tags:{utils:true}}).top().select('name').value())

Parameters

NameTypeDescription
objRecord<string, Function>扩展的函数声明

Returns

void