【问题标题】:Averaging JavaScript array values平均 JavaScript 数组值
【发布时间】:2021-06-24 17:20:13
【问题描述】:

我有一个环境传感器通过 mqtt 将值发送到红色节点。传感器值可能会有所不同,因此我试图平均最后几个以使读数平滑一点。但是我没有得到我期望的输出。正在输入的值 (msg.payload) 范围从 '9865' 到 '10008' 。我希望输出为〜5.9,但我得到小数位,即'0.5766570605187319'

var calSolution1 = 7.00;
var calSolution2 = 4.00;
var calReading1 = 9564;
var calReading2 = 10605;

var length = 10;
var phArray = new Array(length);

var m = (calSolution2-calSolution1)/(calReading2-calReading1); //slope
var b = calSolution1-m*calReading1; //intercept
var x = msg.payload;

var pH = m*x+b;

  phArray.shift();
  phArray.push(pH);


const reducer = (accumulator, currentValue) => accumulator + currentValue;
msg.payload = (phArray.reduce(reducer) / length);

return msg;

【问题讨论】:

  • 如果只放入一个元素,为什么还要使用数组?根据您提供的代码,我猜它与msg.payload = (m*x+b)/length 相同
  • 每 10 秒收到一个新的 msg.payload。我想平均最后 10 个以消除读数的变化。

标签: javascript mqtt node-red


【解决方案1】:

phArray 的长度为 10,但在被填充之前,例如在处理第一条消息时,它有一个有效元素:

phArray = [<empty> ...x9, 5] 

当这是reduced 时,只考虑5,所以平均值是5,除以10。由于技术上正确但逻辑上错误length,因此计算错误。

使用真正的循环缓冲区/数组实现会更简洁——它们会为您跟踪其逻辑长度(或滚动您自己的)。由于其length 属性在逻辑上是一致的,因此可用于取平均值。


无关,但是当一个 sn-p 不可执行时,它是一个 sn-p 没有意义。这可以使用迭代的源值数组进行原型化,在每次迭代时运行您的数据处理代码。

【讨论】:

    【解决方案2】:

    既然这是 Node-RED,你看过 node-red-node-smooth 吗?

    它可以配置为提供给定数量值的平均值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      相关资源
      最近更新 更多