Node-RED中使用JavaScript循环创建嵌套JSON对象时如何实现元素追加?
解决Node-RED中构建多层JSON对象的问题
你遇到的核心问题是每次循环都创建新对象并覆盖了之前的存储结果,而且误用了数组的append/push方法(这些方法只适用于数组,不能直接操作对象)。咱们一步步来修正:
问题根源分析
你原来的代码里,每次循环都会生成一个全新的channels对象,然后用flow.set("gaugeData", channels)直接覆盖掉flow里之前存储的内容,所以最后自然只剩最后一次循环的{"8": {"360":250}}。另外,你想要的通道键是ch1到ch8,但原来的代码用[i]生成的是数字键(比如"1"),这也不符合你需要的结构。
正确实现代码
我们需要先初始化一个空对象,然后逐步往里面嵌套添加通道和度数属性,最后一次性存入flow:
// 先创建一个空的根对象,用来存放所有通道数据 let gaugeData = {}; // 遍历1到8,构建ch1到ch8的通道 for(let i = 1; i <= 8; i++){ // 定义当前通道的键名,比如ch1、ch2 const channelName = `ch${i}`; // 给当前通道初始化一个空对象,用来存储度数对应的数值 gaugeData[channelName] = {}; // 遍历10到360,步长10,生成每个度数的键值对 for(let c = 10; c <= 360; c += 10){ // 给当前通道的对应度数赋值 gaugeData[channelName][c] = randInt(); } } // 所有数据构建完成后,再存入flow,避免循环过程中反复覆盖 flow.set("gaugeData", gaugeData);
为什么这样能行?
- 先初始化根对象:
gaugeData一开始是空对象,后续所有操作都是往这个对象里添加属性,而不是每次新建对象覆盖原有内容。 - 嵌套构建结构:先给每个通道创建空对象,再往通道对象里添加度数键值对,完美匹配你需要的多层JSON结构。
- 一次性存入flow:只有当整个
gaugeData构建完成后,才用flow.set存入,彻底避免了循环过程中反复覆盖的问题。
额外补充:如果需要追加到已有数据
如果你不是要重新构建整个gaugeData,而是要在已有数据的基础上追加内容,可以先从flow里取出已有对象,再进行修改:
// 先取出已有的gaugeData,如果不存在就初始化空对象 let gaugeData = flow.get("gaugeData") || {}; // 后续的循环构建逻辑和上面一致... // 最后将更新后的对象存回flow flow.set("gaugeData", gaugeData);
内容的提问来源于stack exchange,提问作者Thom G
相关产品推荐
相关产品推荐

