前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入剖析vscode工具函数(九)数字相关处理

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

作者头像
孟健
发布2023-10-31 19:17:46
2130
发布2023-10-31 19:17:46
举报
文章被收录于专栏:前端工程

VSCode中的numbers模块

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

clamp函数

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

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

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

rot函数

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

代码语言:javascript
复制
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中有一个类是用来计算移动平均值的:

代码语言:javascript
复制
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延时、进度显示等策略上,让数值更加平滑。

滑动窗口平均值

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

代码语言:javascript
复制
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的工具函数中方便地使用,让我们能够更轻松地处理数字相关的任务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟健的前端认知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • VSCode中的numbers模块
    • clamp函数
      • rot函数
        • 移动平均值
          • 滑动窗口平均值
            • 小结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档