lodash源码分析之intersectionWith

本文为读 lodash 源码的第四十八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

gitbook也会同步仓库的更新,gitbook地址:pocket-lodash

依赖

import map from './map.js'
import baseIntersection from './.internal/baseIntersection.js'
import castArrayLikeObject from './.internal/castArrayLikeObject.js'
import last from './last.js'

《lodash源码分析之map的实现》

《lodash源码分析之baseIntersection》

《lodash源码分析之castArrayLikeObject》

《lodash源码分析之last》

源码分析

intersectionWith 的作用和 intersection 不同的是 intersectionWith 可以定义自己的比较函数。

它可以这样使用:

intersectionWith([{a: 1, b: 2}], [{a: 1}], function (val1, val2) {
  return va1.a === val2.a
}) // [{a: 1, b: 2}]

源码实现如下:

function intersectionWith(...arrays) {
  let comparator = last(arrays)
  const mapped = map(arrays, castArrayLikeObject)

  comparator = typeof comparator === 'function' ? comparator : undefined
  if (comparator) {
    mapped.pop()
  }
  return (mapped.length && mapped[0] === arrays[0])
    ? baseIntersection(mapped, undefined, comparator)
    : []
}

其找出 comparator 的过程和 intersectionBy 类似,即取出 arrays 的最后一项。

comparator = typeof comparator === 'function' ? comparator : undefined

然后判断 comparator 是否为 function,如果为 function 则表示 comparator 有传,则要将 mapped 最后的一项取出,因为最后一项为 comparator

最后将 mappedcomparator 传给 baseIntersection 函数找出交集。

相关链接

《lodash源码分析之intersection》

《lodash源码分析之intersectionBy》

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面

results matching ""

    No results matching ""