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源码分析之remove #80

Open
HeftyKoo opened this issue Feb 19, 2020 · 0 comments
Open

lodash源码分析之remove #80

HeftyKoo opened this issue Feb 19, 2020 · 0 comments
Labels
api 暴露出来的接口 系列文章

Comments

@HeftyKoo
Copy link
Owner

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

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

依赖

import basePullAt from './.internal/basePullAt.js'

《lodash源码分析之basePullAt》

源码分析

remove 的作用跟 pullAt 的作用差不多,只不过 pullAt 只能传入 indexesremove 传入的是一个断言函数 predicate,在遍历数组的过程中,如果 predicate 返回的值为真值,则将这个值从数组中删除。

pullAt 一样,remove 除了会更改原数组外,最终返回的是被删除的值 。

源码如下:

function remove(array, predicate) {
  const result = []
  if (!(array != null && array.length)) {
    return result
  }
  let index = -1
  const indexes = []
  const { length } = array

  while (++index < length) {
    const value = array[index]
    if (predicate(value, index, array)) {
      result.push(value)
      indexes.push(index)
    }
  }
  basePullAt(array, indexes)
  return result
}

首先初始化 result 来保存被删除的值。

indexes 来保存将要从数组中删除值的索引。

判断 array 是否传入,或者是否为空,如果没有传入,或者传入的是空数组,则将空的 result 返回即可。

然后遍历数组,在遍历的过程中,将当前值 value 和当前索引 index 及原数组 array 传入 predicate 函数,如果 predicate 函数返回真值,表示这个值是需要删除的,那就将这个值存入结果数组 result 中,并且将要删除的索引存入 indexes 中。

注意,在遍历的过程中,是没有在原数组中进行值的删除的,只是保存要删除的索引。

在收集完成要删除的索引 indexes 后,调用 basePullAt 将对应的索引的值全部删除。

最后返回删除的值 result

License

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

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

作者:对角另一面

@HeftyKoo HeftyKoo added 系列文章 api 暴露出来的接口 labels Feb 19, 2020
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