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源码分析之difference #28

Open
HeftyKoo opened this issue Sep 24, 2018 · 0 comments
Open

lodash源码分析之difference #28

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

Comments

@HeftyKoo
Copy link
Owner

一切充满了善,然而到处是不凑巧。既然是不凑巧,因之素朴的善终难免产生悲剧。

——沈从文

本文为读 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'

lodash源码分析之数组的差集

lodash源码分析之baseFlatten

lodash源码分析之isArrayLikeObject

源码分析

好了,终于分析到 difference 了,这个函数的参数数量并不固定,每个参数都是数组,作用是找出第一个数组中,都不存在于后面所有数组中的项,并组成新的数组返回。

其实从本系列文章的第四篇开始,就跟 difference 函数有关,但是 difference 的代码只有寥寥几行,下面便是全部的源码:

function difference(array, ...values) {
    return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
    : []
}

其实不看前面的文章,单纯从这几个代码中,也大概能捋出 difference 的思路。

首先,如果 array 不是数组,那根本就没有比较的必要了,因此直接返回一个空数组。

因为使用了解构,因此 values 其实是一个二维数组,因此使用 baseFlatten 将二维数组展平成一维数组。

difference 的核心功能在 baseDifference 中,因为 baseDifference 比较的是两个数组,在将 values 展平后,就可以正常调用 baseDifference 了。

以上,便是 baseDifference 的全部分析了,要更详细的了解内部实现,从本系列的第四篇开始看起,就会一清二楚了。

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