JavaScript中第三方库underscore提供了一套完善的函数式编程的接口,与jQuery类似,它会把自身绑定到唯一的全局变量_上,这也是为何它的名字叫underscore.
比如,underscore的map()可以作用与Array和Object:
_.map([1, 2, 3], (x) => x * x); // [1, 4, 9]
_.map({ a: 1, b: 2, c: 3 }, (v, k) => k + '=' + v); // ['a=1', 'b=2', 'c=3']
1.Collections
对集合类对象提供的接口,仅支持Array和Object,不支持Map和Set
map/mapObject //返回映射/对象映射后的集合类对象,传入callback
filter //返回过滤后的集合类对象,传入callback
every / some //返回是否所有元素的布尔值/返回是否有>1个元素符合的布尔值,传入callback
max / min //返回最大值/最小值
groupBy // 返回分组后的集合类对象,传入callback
shuffle / sample // 返回打乱顺序后集合类对象/返回随机取指定个数元素的集合类对象
2.Arrays
对array提供的函数
first / last //取array的第一个值和最后一个值
flatten //将多维array展开为一维
zip / unzip //将两个array压缩成二维列表/unzip相反
object //类似zip,但将两个array转为object
range // 类似python,快速生成一个array
3.Functions
对函数提供的函数
bind(object.function, object) // 返回一个新的函数,该函数可以调用原对象的函数功能,传入一个对象的函数和对象本身,
partial // 返回一个固定了某个参数的新函数,称为偏函数,用法与python一致
memoize //返回一个新函数,该函数可以实现缓存原函数之前相同的调用结果
once // 返回一个新函数,该函数可以保证某个函数执行且仅执行一次
delay // 可以让一个函数延迟执行,效果和setTimeout()一样
4.Objects
针对Object的功能接口
keys / allKeys //返回对象的key的array,包含/不包含原型链继承的key
values //返回对象不包含原型链的value的array
mapObject //针对对象的map方法
invert //交换key和value
extend / extendOwn // 将多个对象合为一个, extendOwn不包含原型链继承的
clone //浅拷贝一个对象
isEqual //返回布尔值,对两个对象进行深度比较
Chaining
Chaining是指链式调用
underscore提供了把对象包装成能进行链式调用的方法,就是chain()函数:
var r = _.chain([1, 4, 9, 16, 25])
.map(Math.sqrt)
.filter(x => x % 2 === 1)
.value();
console.log(r); // [1, 3, 5]
因为每一步返回的都是包装对象,所以最后一步的结果需要调用value()获得最终结果。
网友评论