深入剖析vscode工具函数(九)数字相关处理

VSCode中的numbers模块

在VSCode的工具函数中,numbers模块提供了一些方便处理数字的函数。其中包括clamp函数,用于将一个数字限制在指定的范围内;rot函数,用于对一个数字进行循环移位操作;以及计算移动平均值和滑动窗口平均值的函数等等。

clamp函数

clamp 是一个数学术语,表示将一个数值限制在指定的范围内。这个函数的实现非常简单:

typescript 复制代码
export function clamp(value: number, min: number, max: number): number {
 return Math.min(Math.max(value, min), max);
}

就是将value 限定在指定的范围内。虽然简单,但很实用。在vscode很多处理中,都需要考虑到边界问题,这个函数可以很好地预防数字超出边界到范围导致bug。

rot函数

rot 理论上应该代表的是旋转的含义,vscode实现这个函数,本质上是取模运算:

typescript 复制代码
export function rot(index: number, modulo: number): number {
 return (modulo + (index % modulo)) % modulo;
}

比如,调用了rot(5, 3),返回的是2,因为5%3=2 。所谓旋转,可以想象是从数轴上把这个值翻转180,得到的结果。

这里为什么不直接返回index % modulo呢?主要还要考虑负数的情况。比如rot(-1, 5) ,实际上返回的是4 ,表示倒数第一个。

通过这个处理,我们就可以在循环结构中对下标进行安全的操作。

移动平均值

移动平均值是一个统计学中的概念,给定一个数列和一个固定子集大小,移动平均数的第一个元素是由数列的初始固定子集的平均值得到的。

在金融应用中,一个简单移动平均SMA )是以前 n 个数据的未加权平均数

image

当计算下一天的移动平均的时候,就会在求和中加入一个新值,剔除一个旧值,无需把所有数值重新加一遍:

image

在VSCode中有一个类是用来计算移动平均值的:

kotlin 复制代码
export class MovingAverage {

 private _n = 1;
 private _val = 0;

 update(value: number): number {
  this._val = this._val + (value - this._val) / this._n;
  this._n += 1;
  return this._val;
 }

 get value(): number {
  return this._val;
 }
}

在vscode的应用中,移动平均值经常被用来计算debounce延时、进度显示等策略上,让数值更加平滑。

滑动窗口平均值

滑动窗口平均值,顾名思义就是限定了一个固定尺寸的窗口,然后动态计算窗口内的平均值:

kotlin 复制代码
export class SlidingWindowAverage {

 private _n: number = 0;
 private _val = 0;

 private readonly _values: number[] = [];
 private _index: number = 0;
 private _sum = 0;

 constructor(size: number) {
  this._values = new Array(size);
  this._values.fill(0, 0, size);
 }

 update(value: number): number {
  const oldValue = this._values[this._index];
  this._values[this._index] = value;
  this._index = (this._index + 1) % this._values.length;

  this._sum -= oldValue;
  this._sum += value;

  if (this._n < this._values.length) {
   this._n += 1;
  }

  this._val = this._sum / this._n;
  return this._val;
 }

 get value(): number {
  return this._val;
 }
}

这里要注意this._index = (this._index + 1) % this._values.length; 这行语句,实际上index指针是循环在走,类似循环队列,每次老的元素会被替换,然后sum减去老的,加上新的,重新计算平均值。比如,以输入5个数字为例:

image

index指针一直在这个窗口数组中循环游走。

小结

numbers模块中,vscode实现了一些简单的工具函数。比如,我们可以使用clamp函数将一个数字限制在指定的范围内,使用rot函数对一个数字进行循环移位操作,还可以使用MovingAverage类和SlidingWindowAverage类来计算移动平均值和滑动窗口平均值。这些函数和类都可以在VSCode的工具函数中方便地使用,让我们能够更轻松地处理数字相关的任务。

相关推荐
魏大帅。2 分钟前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
花花鱼8 分钟前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k093312 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
EricWang135833 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
September_ning33 分钟前
React.lazy() 懒加载
前端·react.js·前端框架
web行路人43 分钟前
React中类组件和函数组件的理解和区别
前端·javascript·react.js·前端框架
超雄代码狂1 小时前
ajax关于axios库的运用小案例
前端·javascript·ajax
长弓三石1 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
小马哥编程1 小时前
【前端基础】CSS基础
前端·css
嚣张农民2 小时前
推荐3个实用的760°全景框架
前端·vue.js·程序员