如何解决JS:在多层对象
我试图从通用变量名称(如“Mike”)中引用变量值 以及一个明确的变量名称,如“myNeighbor_Mike_age”。
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,所以我最好不要添加额外的包或使用全局变量。
知道如何收拾东西吗?
提前致谢
解决方法
好吧,看来我把事情复杂化了。 正如@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 人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。