JS:在多层对象

时间:2021-05-11 13:49:49

标签: javascript node.js object-reference

我试图从通用变量名称(如“Mike”)中引用变量值 以及一个明确的变量名称,如“myNeighbor_Mike_age”。

数据库条目带有作为名称的 ID,例如:

dbObject =
   {
   MyNeighbor_Mike_age:21,
   MyFriend_Thomas_age:404,
   MyNeighbor_Nik_age:30
   }
]

我想要一个通用结构,以便我可以为例如编写函数我可能有多个myNeighbor-objectType(例如:“closeNeighbor”;“neighborNextStreat”):

newPersonObject =
{
   "myNeighbor":{
      "Mike":
         {"age":null},
         {"ID":MyNeighbor_Mike_age},
      "Nik":
         {"age":null}
         {"ID":MyNeighbor_Nik_age},
   }
   "myFriend":{
      "Thomas":
         {"age":null}
         {"ID":MyFriend_Thomas_age},
   }
}

我正在寻找一种方法将 dbObject 名称链接到 newPersonObject 的对应对象。所以我只做了一次“链接工作”,然后就可以使用全名(即作为链接函数名称的一部分)来设置值。

我想我可以在主对象中引用它,例如:

   newPersonObject.myNeighbor.Mike.age = dbObject.MyNeighbor_Mike_age

在程序中,我使用计算属性来动态设置值,使其看起来更像这样:


peopleType = Object.keys(newPersonObject)[0]
name = Object.keys(newPersonObject[peopleType][0])
// used a for(-of)-loop but for simplicity 
newPersonObject[peopleType][name]["age"] = dbObject[newPersonObject[peopleType][name].ID]

这样我就可以访问变量而无需解析 DB 变量名(运行时和硬件资源)。 即

newPersonObject[MyNeighbor_Mike_age] = dbObject[MyNeighbor_Mike_age] // =21
// and have also set newPersonObject.myNeighbor.Mike.age to 21

但是没有用。

我想出了以下我认为不是最佳的“解决方案”,BC。我必须调用一个函数,调用似乎违反直觉

newPersonObject.<variableName>(xxx) to set a value:
newPersonObject[personObject.ID] = function(ageValue){
   this[typeOfPerson][name].value = ageValue; 
};

我目前通过这样的循环设置值:


for(let objectKey of Object.keys(dbObject)){   
    newPersonObject[objectKey ](dbArray[objectKey])
    //objectKey should return 
    //MyNeighbor_Mike_age
    //myFriend_Thomas_age
    //MyNeighbor_Nik_age
}

我使用的是 Node-Red,所以我最好不要添加额外的包或使用全局变量。

知道如何收拾东西吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

好吧,看来我把事情复杂化了。 正如@Bergi 指出的,以下内容更有用: 而不是引用值,我现在只是对相关属性进行循环

// for each group like "neighbor";"friend"
for(let peopleType in newPersonObject){
   //for each name like "Mike" "Nik" "Thomas"
   for(let name in newPersonObject[peopleType]){
           let unambiguousID = newPersonObject[peopleType][name].ID
           newPersonObject[peopleType][name].age= dbObject[unambiguousID];
       }
}

这比加入自定义功能更容易、更简洁,就像我的第一个想法。 到目前为止,性能影响看起来并不极端,也不显着 从 1-3 ms 到 1-4 ms 到目前为止,5 种类型的 1000 人。