深入剖析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的工具函数中方便地使用,让我们能够更轻松地处理数字相关的任务。

相关推荐
白日梦想家6814 分钟前
定时器实战避坑+高级用法,从入门到精通
开发语言·前端·javascript
遗憾随她而去.4 分钟前
前端 Loadsh 经常使用的方法总结
前端
Csvn11 分钟前
前端安全加固:XSS、CSRF、CSP 防护实战
前端
momo(激进版)18 分钟前
mathjs使用简记
前端·javascript
JarvanMo20 分钟前
7 个开源 iOS 应用,让你成为更好的开发者
前端·ios
jjw_zyfx22 分钟前
css 点击显示并移动元素,再次点击移回元素并消失
前端·javascript·css
虎子_layor22 分钟前
Headless Chrome 该退休了?Obscura 正在给 AI Agent 换浏览器底座
前端·人工智能·后端
深海鱼在掘金25 分钟前
Next.js从入门到实战保姆级教程(第六章):服务端组件与客户端组件
前端·typescript·next.js
HookJames26 分钟前
Turnkey PCBA - Hero
前端·php
深海鱼在掘金30 分钟前
Next.js从入门到实战保姆级教程(第十章):表单处理与 Server Actions
前端·typescript·next.js