JS:将新对象推入嵌套的数组对象

时间:2019-06-23 18:52:46

标签: javascript arrays node-red

我想构建一个带有数组,对象,数组等的嵌套JS对象,该对象将homie变量保持在不同的级别,非常类似于用于存储和从homie v3检索的简单存储结构。 0.1 convention。 (我将自己的一些结构包括在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 Shadow或变量arrHomieShw的数组层次结构中更下方的数组中(从全局上下文变量homieShw)。

  • 要在对象的第一个数组中添加ESP设备,请使用JS代码,该代码测试deviceID是否已在数组中,如果没有,则向数组中添加新元素(此代码可正常工作)< / strong>,从上方的传入mqtt message
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 );
    }
}
  • 上面的函数检查对象是否存在,如果不存在,则将新分支推送到arrHomieShw中,这可以正常工作。
  • 但是现在,我想对homieShw层次结构的下一个级别的数组执行相同的操作。因此,我想通过检查deviceID是否存在nodeID来写入对象的 node 数组,如果不存在,则将一个新分支推入其中。

  • 如上所述,push命令不想将其推送到层次结构中。这是我尝试过的(以及其他)。在变量checkNodesArrCreated()之后调用函数homie/ESP70/Air/Temperature/23,例如,带有以下mqtt消息:arrIdxDevice = getDeviceIdx();-也请参见下面的此函数。

  • 在函数checkNodesArrCreated()中,将分支变量-推送到嵌套数组arrHomieShw中会创建一个新对象,并且不会在找到的同一deviceID下分支。我还尝试使用arrHomieShw.deviceID.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;
        }
    }
}

0 个答案:

没有答案