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

相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom11 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试