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源码分析之sortedIndexOf #85

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

lodash源码分析之sortedIndexOf #85

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

Comments

@HeftyKoo
Copy link
Owner

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

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

依赖

import baseSortedIndex from './.internal/baseSortedIndex.js'
import eq from './eq.js'

《lodash源码分析之baseSortedIndex》

《lodash源码分析之NaN不是NaN》

源码分析

sortedIndexOf 的作用跟 indexOf 差不多,都是查找指定的 value 在数组 array 中的位置。

但是 sortedIndexOf 要求传入的数组是已经排序好的数组,在这种情况下,因为 sortedIndexOf 会使用二分法查找,比 indexOf 的性能更加高。

具体源码如下:

function sortedIndexOf(array, value) {
  const length = array == null ? 0 : array.length
  if (length) {
    const index = baseSortedIndex(array, value)
    if (index < length && eq(array[index], value)) {
      return index
    }
  }
  return -1
}

首先获取数组 array 的长度,如果数组没有传,或者数组的长度为 0 ,也即空数组,直接返回 -1 ,跟 indexOf 的行为一致。

接着调用 baseSortedIndex,由 baseSortedIndex 的源码分析可知,baseSortedIndex 使用的是二分法查找,这个找出的是 value 应该插入到数组中的位置index

这时,还不能断定 value 在数组中存在,要判断这个 indexvalue 在数组中的位置,首先,index 要比数组的长度小,否则,现在的数组根本没有这个 index

其次,在 index 位置上的值要和 value 相等,这里使用 eq 函数进行判断。

如果满足这两个条件,返回 value 所在的索引值 index,否则返回 -1

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