differenceWith
用法
_.differenceBy(array, [values], [iteratee=_.identity])
作用
与difference相比,多了一个compator
(我这里叫它比较器),
demo
还是看官方api给的demo
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
_.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
源码部分
baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
第三个参数对应的是iteratee
,在differenceWith
传入的是undefined
下边的函数我delete掉不会执行的部分。
function baseDifference(array, values, iteratee, comparator) {
var index = -1,
includes = arrayIncludes,
isCommon = true,
length = array.length,
result = [],
valuesLength = values.length;
if (comparator) {
includes = arrayIncludesWith;
isCommon = false;
}
outer:
while (++index < length) {
var value = array[index],
computed = iteratee == null ? value : iteratee(value);
value = (comparator || value !== 0) ? value : 0;
if (!includes(values, computed, comparator)) {
result.push(value);
}
}
return result;
}
两个数组去除交集,当然免不了循环比较。只有符合某种条件,才会push到我们的结果集合中。符合条件的函数的判断在baseDifference
是下段代码
!includes(values, computed, comparator)
我们先分析三个参数,values
是需要排除的数组,computed
是被检查数组中的某个元素;comparator
是每个传入的校验器。
我们需要的结果,computed和迭代中values
的元素,通过comparator处理,如果符合比较条件,返回true,否则返回flase。
for(let i=0;i<values.length;i++){
if(comparator(comuted,values[i])){
return true
}
return false
}
现在可以回看arrayIncludeWith
源码了
function arrayIncludesWith(array, value, comparator) {
var index = -1,
length = array == null ? 0 : array.length;
while (++index < length) {
if (comparator(value, array[index])) {
return true;
}
}
return false;
}
实现的功能是一致的。
上边的demo刚好没给输出结果,看了这么多,一定知道结果是[ { 'x': 2, 'y': 1 }]
comparator
作为一个比较器,它接口两个参数,一个是检查的数组中的元素,和排除的数组中的元素,是否符合某个判断条件。而不是单纯的值判断去重。当然你也可以传入一个如下的函数,它依然是一个值判断
function comparator(o,n){
return o == n
}
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
_.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
// =>[ { 'x': 2, 'y': 1 }]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。