lodash源码研读之union,unionBy,unionWith
一、源码地址
- GitHub 地址 : GitHub - lodash/lodash: A modern JavaScript utility library delivering modularity, performance, & extras.
- 官方文档地址 : Lodash 官方文档
二、结构分析
union,unionBy,unionWith使用到了baseRest、baseUniq、baseFlatten模块,结构框图如下。
- baseRest 模块用于处理可变参数。它接受一个函数作为参数,并返回一个新的函数,该新函数能够接受任意数量的参数,并将这些参数作为数组传递给原函数。
- baseFlatten 模块用于扁平化数组。它将嵌套的数组结构展平到指定的深度。
- baseUniq 模块用于从数组中去除重复的元素。它接受一个数组作为参数,并返回去重后的新数组。
三、函数介绍
下面依次介绍各个函数。
1.union函数
javascript
var union = baseRest(function(arrays) {
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
});
//例子
var result = union([1, 2, 3], [2, 3, 4], [4, 5, 6]);
// result 将是 [1, 2, 3, 4, 5, 6]
union 函数的作用是创建一个包含所有给定数组元素的全新数组,同时去除重复的元素。即并集。
2.unionBy函数
javascript
var unionBy = baseRest(function(arrays) {
var iteratee = last(arrays);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
});
//例子
var result = unionBy([1.1, 2.2, 3.3], [2.4, 3.5, 4.6], Math.floor);
// result 将是 [1.1, 2.2, 3.3, 4.6]
unionBy 函数的作用是创建一个包含所有给定数组元素的全新数组,同时去除重复的元素。与 union 函数不同的是,unionBy 允许你通过一个迭代器函数来定义如何判断元素是否重复。
3.unionWith函数
javascript
var unionWith = baseRest(function(arrays) {
var comparator = last(arrays);
comparator = typeof comparator == 'function' ? comparator : undefined;
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
});
unionWith 函数的作用是创建一个包含所有给定数组元素的全新数组,同时去除重复的元素。与 union 和 unionBy 不同的是,unionWith 允许你通过一个比较器函数(comparator)来定义如何判断元素是否重复。
四、总结
union,unionBy,unionWith函数,是用来求多个数组的并集。其中unionBy可以接收迭代器,unionWith可以接收比较器。