Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lodash源码分析之differenceBy #30

Open
HeftyKoo opened this issue Oct 1, 2018 · 0 comments
Open

lodash源码分析之differenceBy #30

HeftyKoo opened this issue Oct 1, 2018 · 0 comments
Labels
api 暴露出来的接口 系列文章

Comments

@HeftyKoo
Copy link
Owner

HeftyKoo commented Oct 1, 2018

走吧

落叶吹进深谷

歌声却没有归宿

走吧

冰上的月光

已从河床上溢出

走吧

眼睛望着同一片天空

心敲击着暮色的鼓

走吧

我们没有失去记忆

我们去寻找生命的湖

走吧

路啊路

飘满了红罂粟

——北岛《走吧》

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

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

依赖

import baseDifference from './.internal/baseDifference.js'
import baseFlatten from './.internal/baseFlatten.js'
import isArrayLikeObject from './isArrayLikeObject.js'
import last from './last.js'

lodash源码分析之数组的差集

lodash源码分析之baseFlatten

lodash源码分析之isArrayLikeObject

lodash源码分析之last

源码分析

differenceBydifference 的功能差不多,执行后,会返回一个新数组,新数组中的每一项都包含在第一个数组中,但是不包含在后面指定的数组中。

difference 的实现分析可以查看《lodash源码分析之difference》。

differenceBydifference 的唯一不同是可以指定迭代器,如果有指定迭代器,则比较的是迭代器返回的值,并不是直接比较数组中的原始值。如果没有指定迭代器,则和 difference 完成相同。

下面来看下源码:

function differenceBy(array, ...values) {
  let iteratee = last(values)
  if (isArrayLikeObject(iteratee)) {
    iteratee = undefined
  }
  return isArrayLikeObject(array)
    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), iteratee)
    : []
}

如果有指定迭代器,则 differenceBy 的最后一个参数必定不是数组。

因此使用 last 函数获取最后一个参数,然后使用 isArrayLikeObject 是否为类数组,如果是,则表明没有指定迭代器,将 iteratee 设置为 undefined

最后跟 difference 一样,依然是调用 baseDifference 来进行比较,唯一不同的是,baseDifference 会传入第三个参数 iteratee

至于 iteratee 起到怎样的作用,那就需要看《lodash源码分析之数组的差集》了。

License

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

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

作者:对角另一面

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api 暴露出来的接口 系列文章
Projects
None yet
Development

No branches or pull requests

1 participant