源码学习——lodash(十一)

前言

日常开发中碰到排序需求我们会使用sort方法,而lodash也针对sort进行了拓展,本节我们就来学一下sort系列源码。

sortedIndex与sortedLastIndex

  • sortedIndex:检查value在数组中按照顺序插入时的下标,这里会返回尽可能小的下标。
js 复制代码
_.sortedIndex(array, value)
array //数组
value //插入的值
console.log(_.sortedIndex([5,8,8,10],8)) //2

= sortedLastIndex:用法与上面一样,就是返回结果是尽可能大的下标。

js 复制代码
_.sortedLaseIndex(array, value)
console.log(_.sortedLastIndex([5,8,8,10],8)) //3

这两种方法的区别跟其它系统方法有点不一样,不是执行顺序的差异而是下标,下面我们来看下源码:

js 复制代码
function sortedIndex(array, value) {
return baseSortedIndex(array, value);
}
function sortedLastIndex(array, value) {
return baseSortedIndex(array, value, true);
}

两个都用到了baseSortedIndex,话不多说直接源码:

  • 接受三个参数,array、value、retHighest,该参数就是为了区分index与lastIndex。
  • 对value进行判断,这里判断有非空判断、NaN判断、数值溢出的判断。
  • 下面的循环运用到了二分法 的查找思路。(low + high) >>> 1就是用来获取平均值,>>>是位运算符,这种计算方式要更加安全一点。
  • 拿到computed中间坐标的值与value进行对比,computed小于value说明要插入的位置在后半部分,改变low,针对后半部分进行二分;反之改变high对前半部分进行二分。retHighest的判定就是<=与<的区别。
  • 当low与high相等时就找到了,返回high。当value不满足上面条件时就用baseSortedIndexBy 处理下。
    上面二分法的思路及获取平均值的写法还是值得学习的。

sortedIndexBy与sortedLastIndexBy

这两个方法就是在上面两个方法的基础上加了一个迭代函数:

js 复制代码
_.sortedIndexBy(array, value, iteratee)
//iteratee迭代函数 里面有一个参数value
_.sortedIndexBy([{'a':1},{'a':3}], { 'a': 2 }, 'x'); //1

_.sortedLastIndexBy(array, value, iteratee)
_.sortedLastIndexBy([{'a':1},{'a':2},{'a':3}], { 'a': 2 }, 'x'); //2

上述源码中就用到了baseSortedIndexBy,这里我们就直接看该方法的源码:

该方法要复杂点,不过运用的思路还是二分法,我们先看前部分:

  • 与baseSortedIndex相比该方法多了个iteratee参数。
  • 获取到iteratee的value值,接下来就是针对几种特殊值的处理,包括NaN、null、Symbol、undefined。注意这里的mid1的获取就是简单的Math.floor((low + high) / 2),根据computed再次声明针对特殊值处理的常量。
  • 下面就是对几个特殊值进行判断,这里setLow表明查找的序列是否在后半部分,最终得到high结果。

有了二分法的思路,该方法理解起来不难,主要是对几个特殊值的判断,不得不说lodash作者考虑得很全面。

sortedIndexOf与sortedLastIndexOf

这两个方法跟indexOf一样用来查找当前值的序列,不过是要在排序数组中查找。

js 复制代码
_.sortedIndexOf(array, value)
_.sortedLastIndexOf(array, value)

_.sortedIndexOf([1, 2, 2], 2); //1
_.sortedLastIndexOf([1, 2, 2], 2); //2

这两个方法的源码就是在baseSortedIndex基础上实现的,通过baseSortedIndex获取index,将index进行判断,如果不存在的话返回-1。注意lastIndexof时是将结果减去1。

总结

以上就是sorted系列相关方法,主要用以查询下标,其中运用到了二分法的查找思路。

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端