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
相关产品推荐
相关产品推荐

