Node-RED中使用for循环填充对象属性完成图表数据赋值
Node-RED PLC采集图表数据批量构造方案
JavaScript 不支持在对象字面量的属性位置直接编写 for 循环、变量声明这类语句,属性值只接受表达式,你只需要提前把需要的数据集构造完成,再传入 msg.payload 即可,完全不需要逐行硬编码,9通道场景也可以用相同逻辑批量处理。
具体实现步骤
1. 修正原始数据转二维数组的代码
你最开始的转换代码缺少闭合逻辑,补充完整并增加属性校验,避免原型链属性干扰:
// 初始化存储数组 const curveArray = []; for (const key in pressCurve) { if (pressCurve.hasOwnProperty(key)) { curveArray.push([Number(key), pressCurve[key]]); } }
2. 单曲线数据快速生成
不需要硬写36行点配置,直接用数组方法批量生成坐标点,x轴从10开始步长10的规则可以直接通过索引计算:
// 批量生成单条曲线的36个坐标点 const singleCurvePoints = curveArray.map((point, index) => { return { x: (index + 1) * 10, y: point[1] } }); // 组装符合图表要求的payload msg.payload = [{ "series": ["Curve"], "data": [singleCurvePoints], "labels": ["Curve"] }];
3. 9通道数据批量处理
如果需要同时渲染9个通道的曲线,只需要把所有通道的原始数据存在数组中,循环处理即可,不需要重复写配置:
// 假设9个通道的原始采集数据存在channelCurves数组中,每个元素对应一个通道的pressCurve对象 const channelCurves = [pressCurve1, pressCurve2, pressCurve3, pressCurve4, pressCurve5, pressCurve6, pressCurve7, pressCurve8, pressCurve9]; // 自动生成系列名、标签名,也可以替换成你自定义的名称数组 const seriesList = Array.from({length: 9}, (_, idx) => `通道${idx+1}压力曲线`); const labelList = Array.from({length: 9}, (_, idx) => `通道${idx+1}`); // 批量转换所有通道的点数据 const allChannelsData = channelCurves.map(curveData => { const points = []; let pointIndex = 0; for (const key in curveData) { if (curveData.hasOwnProperty(key)) { points.push({ x: (pointIndex + 1) * 10, y: curveData[key] }); pointIndex++; } } return points; }); // 组装最终payload msg.payload = [{ series: seriesList, data: allChannelsData, labels: labelList }];
注意:Node-RED 仪表盘图表的
data字段为二维数组,第一层数组长度和series数量一一对应,每个子数组为对应系列的所有坐标点,不需要额外嵌套多余层级。
内容的提问来源于stack exchange,提问作者Thom G
相关产品推荐
相关产品推荐

