JS:在多层对象中引用 "Sibling"-object value 的 Child
JS: referencing to Child of "Sibling"-object value in multi layer object
我正在尝试从通用变量名称(如“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},
}
}
我正在寻找一种方法来 link dbObject
名称到 newPersonObject
的对应对象。所以我只做了一次“linking 工作”,然后就可以使用全名(即作为 linking 函数名称的一部分)来设置值。
我想我可以在主对象中引用它,例如:
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]
这样我就可以访问变量而无需解析数据库变量名(运行时和硬件资源)。
即
newPersonObject[MyNeighbor_Mike_age] = dbObject[MyNeighbor_Mike_age] // =21
// and have also set newPersonObject.myNeighbor.Mike.age to 21
但是没用。
我想出了以下我认为不是最佳的“解决方案”,公元前。我必须调用一个函数,调用
似乎违反直觉
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];
}
}
这比像我的第一个想法那样加入自定义函数更容易、更清晰。
到目前为止,性能损失看起来并不 极端 也不显着
到目前为止,5 种类型的 1000 人从 1-3 毫秒到 1-4 毫秒。
我正在尝试从通用变量名称(如“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},
}
}
我正在寻找一种方法来 link dbObject
名称到 newPersonObject
的对应对象。所以我只做了一次“linking 工作”,然后就可以使用全名(即作为 linking 函数名称的一部分)来设置值。
我想我可以在主对象中引用它,例如:
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]
这样我就可以访问变量而无需解析数据库变量名(运行时和硬件资源)。 即
newPersonObject[MyNeighbor_Mike_age] = dbObject[MyNeighbor_Mike_age] // =21
// and have also set newPersonObject.myNeighbor.Mike.age to 21
但是没用。
我想出了以下我认为不是最佳的“解决方案”,公元前。我必须调用一个函数,调用
似乎违反直觉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];
}
}
这比像我的第一个想法那样加入自定义函数更容易、更清晰。 到目前为止,性能损失看起来并不 极端 也不显着 到目前为止,5 种类型的 1000 人从 1-3 毫秒到 1-4 毫秒。