首页 > 解决方案 > JS:将新对象推送到嵌套数组对象中

问题描述

我想构建一个嵌套的 JS 对象,其中包含一个数组、对象、数组等,它将homie变量保持在不同的级别,非常类似于一个简单的存储结构,可以从 homie v3.0.1约定中存储和检索。(我在 JS 对象和数组中包含了一些我自己的结构,以提高代码的可读性和灵活性,例如以 _ 下划线开头的变量分组,因此它与 homie 约定不同。)

要存储的嵌套数组/对象的结构(在 Node-RED 全局上下文中 - 以 JS 对象格式),我称之为homie Shadow,(大致deviceID > nodeID > propertyID > propAttribute,其中设备、节点、属性都是嵌套对象的数组)are,:

[
  {"deviceID":
    {"_nodesArr":
        [
          {
            "nodeID":{
              "_propArr":[
                {"propertyID":{"_propertyAttributes":
                    {"$attribute: attributeValue}}}
  }  }    ]  }  }  ]
]

下面是一个示例数据集,它存储在 Node-RED 中名为homieShw(homie Shadow 的缩写)的全局上下文变量中:

[
  {"ESP70":
      {"_nodesArr":
        [
          {"Light": {
              "_propArr":
              [
                {"Switch":{
                          "val":1,
                          "_propAttributes":{"$settable":true}
  }  }    ]  }  }  ]
]

现在,转到我想做的事情,以及我的问题:Javascript 代码将接收来自 的消息mqtt,以设置上述结构,但也会更新变量,例如,当这个 ESP 的灯关闭时,mqtt消息如下所示:

homie/ESP70/Light/Switch/1

在不需要引用我所做的所有代码的情况下,我有一个特定的问题——那就是在homie Shadowor 变量的数组层次结构中存储到一个数组中arrHomieShw(从全局上下文变量中检索homieShw)。

function checkDeviceArrCreated(deviceID, arrHomieShw){

    for (i=0; i < arrHomieShw.length; i++) {
        if(deviceID !== Object.keys(arrHomieShw[i])[0] ) {
            foundDeviceID = 0 } else { foundDeviceID = 1; break }
    }
    if(foundDeviceID === 0){  
        branch = {[deviceID]:{ "_deviceAttributes": {  "$homie": $homie  } }};
        arrHomieShw.push( branch );
    }
}

我该怎么办?

//-----------------------------------------------------------------------
function checkNodesArrCreated(){
    if(deviceID == Object.keys(arrHomieShw[arrIdxDevice])[0] ) {
        theObj = Object.values(arrHomieShw[arrIdxDevice][deviceID])
        if(theObj._nodesArr === undefined){
            branch = { _nodesArr:
                          {[nodeID]:{"_nodeAttributes": {  [nodeAttribute]: val  } } }
                      };
            arrHomieShw.push( branch );
        }
    }
}

//-----------------------------------------------------------------------
function getDeviceIdx(){
    for (i=0; i < arrHomieShw.length; i++) {
        if(deviceID == Object.keys(arrHomieShw[i])[0] ) {
            return i;
        }
    }
    return arrIdxDevice;
}

function getNodeIdx(deviceID, nodeID, arrIdxDevice, arrHomieShw){
    for (j=0; j < arrHomieShw[arrIdxDevice][deviceID]._nodesArr.length; j++) {
        if(nodeID == arrHomieShw[arrIdxDevice][deviceID]._nodesArr[j]){
            return j;
        }
    }
}

标签: javascriptarraysnode-red

解决方案


推荐阅读