JavaScript统计数组低于阈值元素数量及条件告警实现方法
问题解答
1. JavaScript统计数组内低于阈值元素数量的方法
可以直接使用Array.prototype.filter()筛选符合条件的元素后取length属性,也可以用reduce一步完成统计,不需要生成中间数组,性能更优:
// 方法1:filter筛选后取长度 const lowCount = arr.filter(item => item < threshold).length; // 方法2:reduce直接统计(推荐,无额外内存开销) const lowCount = arr.reduce((sum, item) => item < threshold ? sum + 1 : sum, 0);
2. 完整告警逻辑实现
你原有代码存在几个问题:do-while循环重复将同一个z值推入数组10次,不符合滑动窗口存储最近10次计算结果的需求;filter回调中普通函数的this指向错误,无法正确获取实例的limitZ属性。下方是可直接运行的完整实现:
// 初始化阶段,挂载到实例上的公共属性 this.limitZ = 45; this.recentZList = []; // 存储最近10次processAverage的计算结果 const MAX_HISTORY_LENGTH = 10; // 滑动窗口最大长度 const ALERT_TRIGGER_COUNT = 5; // 触发告警的最低异常次数 // 每次设备上传新数据时执行的逻辑 const z = this.processAverage(e1, e3); // 加入最新计算结果 this.recentZList.push(z); // 数组长度超过10时删除最早的一条数据,维持滑动窗口大小 if (this.recentZList.length > MAX_HISTORY_LENGTH) { this.recentZList.shift(); } // 可选:仅当存满10次数据后才开始告警判断,避免刚启动时数据不足误报 if (this.recentZList.length === MAX_HISTORY_LENGTH) { // 统计低于阈值的次数 const abnormalCount = this.recentZList.reduce((sum, val) => val < this.limitZ ? sum + 1 : sum, 0); // 达到阈值触发告警 if (abnormalCount >= ALERT_TRIGGER_COUNT) { this.emit('alert', msg); } }
内容的提问来源于stack exchange,提问作者user16779293
相关产品推荐
相关产品推荐

