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 毫秒。