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源码分析之baseWhile #34

Open
HeftyKoo opened this issue Aug 22, 2019 · 0 comments
Open

lodash源码分析之baseWhile #34

HeftyKoo opened this issue Aug 22, 2019 · 0 comments
Labels
internal 内部函数或方法 系列文章

Comments

@HeftyKoo
Copy link
Owner

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

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

依赖

import slice from './slice.js'

读lodash源码之从slice看稀疏数组与密集数组

源码分析

baseWhile 是实现 dropWhiletakeWhile 的工具函数。

源码如下:

function baseWhile(array, predicate, isDrop, fromRight) {
  const { length } = array
  let index = fromRight ? length : -1

  while ((fromRight ? index-- : ++index < length) &&
    predicate(array[index], index, array)) {}

  return isDrop
    ? slice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
    : slice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index))
}

baseWhile 接收四个参数,第一个参数很明显是需要处理的数组,其它参数后面分析的时候再看。

我们先来看这段:

let index = fromRight ? length : -1

while ((fromRight ? index-- : ++index < length) &&
       predicate(array[index], index, array)) {}

如果 fromRighttrue,则 index 为数组的长度,否则为 -1

接下来是一段遍历,先看这个条件: fromRight ? index-- : ++index < length ,这时 fromRight 的意思就很显示了,表示数组从后往前遍历,因为 fromRighttrue 时,indexlength ,因此使用 index— 迭代。

接下来再看这个条件: predicate(array[index], index, array) ,每次迭代的时候,都会将当前迭代到的数组项、索引、和数组传给 predicate 函数,当 predicate 返回假值时,循环中止,此时索引 index 为中止时的索引。

isDrop 的是指是否将遍历过的项给移除掉。

先来看移除掉的情况:

slice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))

这样看就一目了然了,如果是从后向前遍历,相当于调用 slice(0, index+1) ,保留 0index 的所有项。从前向后遍历,则相当于调用 slice(index, length) ,保留 index 到最后一项。

保留的情况则正好相反:

slice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index))

如果从后向前遍历,其实是保留后半截,即相当于 slice(index+ 1, length)

如果是从前向后遍历,其实是保留前半截,即相当于 slice(0, index)

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
internal 内部函数或方法 系列文章
Projects
None yet
Development

No branches or pull requests

1 participant