前言
lodash 中有一套自己的迭代器,那就是 iteratee
,很多地方都需要用到,官方文档说的也很云里雾里,那究竟是怎么一回事呢?
iteratee
先看对 iteratee
的定义:
[iteratee=_.identity] (Array|Function|Object|string)
可取四种类型。
string
来看一个 _.groupBy()
的例子:
// The `_.property` iteratee shorthand.
_.groupBy(['one', 'two', 'three'], 'length');
// => { '3': ['one', 'two'], '5': ['three'] }
_.groupBy()
的作用是根据第二个参数传入的 iteratee
定义的规则进行分组,这里使用了 string 的 iteratee 。
显而易见,传入 string 就等同于:
_.groupBy(['one', 'two', 'three'], o => o.length);
按官方的
The
_.property
iteratee shorthand
来说,传入字符串还等同于使用了 _.property
的简写,来看一下 _.property
的定义:
_.property(path)
创建一个返回给定对象的 path 的值的函数。
path (Array|string): 要得到值的属性路径。
也就是取 path 上的值而已,总结一下:
使用 string 等价于使用对象的 path 上的值。
array
来看一个例子:
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
_find()
函数的作用是根据第二个参数传入的 iteratee
定义的规则来寻找第一个返回真值的元素。
我们关注的重点不是 _.find()
怎么用,也不是 users
是什么对象,我们需要知道 array 形式的 iteratee
是什么!
实际上,array 形式的 iteratee
等同以下函数:
_.find(users, o => o.active === false);
按官方的话来说,array 形式的 iteratee
也是 _.matchesProperty
的简写,来看一下 _.matchesProperty
的定义:
_.matchesProperty(path, srcValue)
创建一个深比较的方法来比较给定对象的 path 的值是否是 srcValue 。 如果是返回 true ,否则返回 false 。
path (Array|string): 给定对象的属性路径名。
srcValue (*): 要匹配的值。
说白了刚刚我们使用 string 是取 path 上的值,而这里是把 path 上的值取出来做比较而已。
总结一下:
array 形式的 iteratee
等同于取 path 上的值做比较。
object
来看一个例子:
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
有了刚刚的经验,相信这里应该很快就能脱口而出,object 形式的 iteratee
等同于 _.matches
函数的缩写,来看一下 _.matches
函数的作用:
_.matches(source)
创建一个深比较的方法来比较给定的对象和 source 对象。 如果给定的对象拥有相同的属性值返回 true,否则返回 false。
source (Object): 要匹配属性值的源对象。
他就相当于在 users 里去遍历每一个元素,这个元素一定要满足有你给的 object 形式的 iteratee
里面相同的 key 和 value ,这个元素可以有更多的 key 和 value,但是你给的 object 里的 key 和 value 必须有。
那么符合这样条件的第一个元素会被 _.find
出来。
function
这个是大家老生常谈用的了,都熟悉得很。
总结
什么是 iteratee
?
-
传 string 是直接返回 path 上的值 <=>
_.property
-
传 array 是把 path 上的值做比较 <=>
_.matchesProperty
-
传 object 是去 match 匹配看看你给的 key 和 value 都有没有,可以比你给的多,但是不能少 <=>
_.matches
-
传 function 你懂的