You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S7-node从西门子PLC取数后自动创建嵌套对象的方法咨询

如何根据带点分隔的变量名自动创建嵌套对象?

你可以通过编写一段JavaScript代码,在Node-RED的函数节点中实现从扁平带点变量名到嵌套对象的转换,具体实现如下:

实现逻辑

遍历从S7-node获取的扁平键值对,将每个带点分隔的变量名拆分为层级路径,逐层创建嵌套对象,最后把对应值赋值到最底层属性上。

代码示例

将以下代码放入Node-RED的函数节点中:

// 假设S7-node返回的原始数据存储在msg.payload,结构类似:
// { "line1.color.value": "red", "line1.speed.value": 50, "line2.color.value": "blue", "line2.speed.value": 60 }
const rawPayload = msg.payload;
const nestedObj = {};

// 遍历所有带点分隔的变量键
for (const fullKey in rawPayload) {
  if (Object.prototype.hasOwnProperty.call(rawPayload, fullKey)) {
    const keyParts = fullKey.split('.');
    let currentLevel = nestedObj;
    
    // 逐层构建嵌套对象
    for (let i = 0; i < keyParts.length - 1; i++) {
      const part = keyParts[i];
      if (!currentLevel[part]) {
        currentLevel[part] = {};
      }
      currentLevel = currentLevel[part];
    }
    
    // 给最底层属性赋值
    currentLevel[keyParts[keyParts.length - 1]] = rawPayload[fullKey];
  }
}

// 替换原payload为嵌套对象
msg.payload = nestedObj;
return msg;

效果说明

执行代码后,原始扁平数据会转换为嵌套结构:

{
  line1: {
    color: { value: "red" },
    speed: { value: 50 }
  },
  line2: {
    color: { value: "blue" },
    speed: { value: 60 }
  }
}

此时你就能通过msg.payload.line1.color.value这类方式正常访问对应数据了。

注意事项

  • 若存在路径完全相同的变量名,后出现的值会覆盖先出现的值;
  • 若变量名包含.以外的特殊分隔符,需调整split('.')中的分隔符参数。

内容的提问来源于stack exchange,提问作者Piou2fois

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:10