We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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 源码的第三十三篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
import slice from './slice.js'
读lodash源码之从slice看稀疏数组与密集数组
baseWhile 是实现 dropWhile 和 takeWhile 的工具函数。
baseWhile
dropWhile
takeWhile
源码如下:
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)) {}
如果 fromRight 为 true,则 index 为数组的长度,否则为 -1。
fromRight
true
index
-1
接下来是一段遍历,先看这个条件: fromRight ? index-- : ++index < length ,这时 fromRight 的意思就很显示了,表示数组从后往前遍历,因为 fromRight 为 true 时,index 为 length ,因此使用 index— 迭代。
fromRight ? index-- : ++index < length
length
index—
接下来再看这个条件: predicate(array[index], index, array) ,每次迭代的时候,都会将当前迭代到的数组项、索引、和数组传给 predicate 函数,当 predicate 返回假值时,循环中止,此时索引 index 为中止时的索引。
predicate(array[index], index, array)
predicate
isDrop 的是指是否将遍历过的项给移除掉。
isDrop
先来看移除掉的情况:
slice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
这样看就一目了然了,如果是从后向前遍历,相当于调用 slice(0, index+1) ,保留 0 到 index 的所有项。从前向后遍历,则相当于调用 slice(index, length) ,保留 index 到最后一项。
slice(0, index+1)
0
slice(index, length)
保留的情况则正好相反:
slice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index))
如果从后向前遍历,其实是保留后半截,即相当于 slice(index+ 1, length)
slice(index+ 1, length)
如果是从前向后遍历,其实是保留前半截,即相当于 slice(0, index)
slice(0, index)
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面
The text was updated successfully, but these errors were encountered:
No branches or pull requests
本文为读 lodash 源码的第三十三篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
依赖
读lodash源码之从slice看稀疏数组与密集数组
源码分析
baseWhile
是实现dropWhile
和takeWhile
的工具函数。源码如下:
baseWhile
接收四个参数,第一个参数很明显是需要处理的数组,其它参数后面分析的时候再看。我们先来看这段:
如果
fromRight
为true
,则index
为数组的长度,否则为-1
。接下来是一段遍历,先看这个条件:
fromRight ? index-- : ++index < length
,这时fromRight
的意思就很显示了,表示数组从后往前遍历,因为fromRight
为true
时,index
为length
,因此使用index—
迭代。接下来再看这个条件:
predicate(array[index], index, array)
,每次迭代的时候,都会将当前迭代到的数组项、索引、和数组传给predicate
函数,当predicate
返回假值时,循环中止,此时索引index
为中止时的索引。isDrop
的是指是否将遍历过的项给移除掉。先来看移除掉的情况:
slice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
这样看就一目了然了,如果是从后向前遍历,相当于调用
slice(0, index+1)
,保留0
到index
的所有项。从前向后遍历,则相当于调用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)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面
The text was updated successfully, but these errors were encountered: