每天一个lodash方法-differenceWith

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 }]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值