我想构建一个带有数组,对象,数组等的嵌套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
)。
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 );
}
}
但是现在,我想对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;
}
}
}