和Array
的map()
与filter()
类似,但是underscore的map()
和filter()
可以作用于Object。当作用于Object时,传入的函数为function (value, key)
,第一个参数接收value,第二个参数接收key
every / some
当集合的所有元素都满足条件时,_.every()
函数返回true
,当集合的至少一个元素满足条件时,_.some()
函数返回true
max / min
这两个函数直接返回集合中最大和最小的数
如果集合是Object,max()
和min()
只作用于value,忽略掉key
groupBy
groupBy()
把集合的元素按照key归类,key由传入的函数返回
shuffle / sample
shuffle()
用洗牌算法随机打乱一个集合
sample()
则是随机选择一个或多个元素
irst / last
顾名思义,这两个函数分别取第一个和最后一个元素
flatten
flatten()
接收一个Array
,无论这个Array
里面嵌套了多少个Array
,flatten()
最后都把它们变成一个一维数组
zip / unzip
zip()
把两个或多个数组的所有元素按索引对齐,然后按索引合并成新数组。例如,你有一个Array
保存了名字,另一个Array
保存了分数,现在,要把名字和分数给对上,用zip()
轻松实现
object
有时候你会想,与其用zip()
,为啥不把名字和分数直接对应成Object呢?别急,object()
函数就是干这个的:
'use strict';
var names = ['Adam', 'Lisa', 'Bart'];
var scores = [85, 92, 59];
_.object(names, scores);
// {Adam: 85, Lisa: 92, Bart: 59}
注意_.object()
是一个函数,不是JavaScript的Object
对象。
range
range()
让你快速生成一个序列,不再需要用for
循环实现了
当用一个变量fn
指向一个对象的方法时,直接调用fn()
是不行的,因为丢失了this
对象的引用。用bind
可以修复这个问题。
partial
partial()
就是为一个函数创建偏函数。假设我们经常计算2y,每次都写Math.pow(2, y)
就比较麻烦,如果创建一个新的函数能直接这样写pow2N(y)
就好了,这个新函数pow2N(y)
就是根据Math.pow(x, y)
创建出来的偏函数,它固定住了原函数的第一个参数(始终为2).
var pow2N = _.partial(Math.pow, 2);
pow2N(3); // 8
pow2N(5); // 32
pow2N(10); // 1024
如果我们不想固定第一个参数,想固定第二个参数怎么办?比如,希望创建一个偏函数cube(x)
,计算x3,可以用_
作占位符,固定住第二个参数:
'use strict';
var cube = _.partial(Math.pow, _, 3);
cube(3); // 27
cube(5); // 125
cube(10); // 1000
可见,创建偏函数的目的是将原函数的某些参数固定住,可以降低新函数调用的难度
memoize
如果一个函数调用开销很大,我们就可能希望能把结果缓存下来,以便后续调用时直接获得结果。
once
顾名思义,once()
保证某个函数执行且仅执行一次。
delay
delay()
可以让一个函数延迟执行,效果和setTimeout()
是一样的
keys / allKeys
keys()
可以非常方便地返回一个object自身所有的key,但不包含从原型链继承下来的
allKeys()
除了object自身的key,还包含从原型链继承下来的
values
和keys()
类似,values()
返回object自身但不包含原型链继承的所有值
mapObject
mapObject()
就是针对object的map版本
invert
invert()
把object的每个key-value来个交换,key变成value,value变成key
如果有相同的key,后面的object的value将覆盖前面的object的value。
extendOwn()
和extend()
类似,但获取属性时忽略从原型链继承下来的属性