Javascript 对象的对象的访问属性

Javascript 对象的对象的访问属性,javascript,object,ecmascript-6,key,Javascript,Object,Ecmascript 6,Key,具有这种形式的物体: myObj = { id: 1, values: { internal: { myProp1: true myProp2: true }, external: { myProp1: true myProp2: true } } }; 我希望当

具有这种形式的物体:

myObj = {
    id: 1,
    values: {
        internal: {
                myProp1: true
                myProp2: true
            },
        external: {
                myProp1: true
                myProp2: true
            }

    }
};
我希望当我选择一个选项时,
internal
external
能够仅为我选择的一个选项将
myProp1
设置为false

在这种情况下,如果我选择
internal
,对象应该如下所示:

myObj = {
    id: 1,
    values: {
        internal: {
                myProp1: false
                myProp2: true
            },
        external: {
                myProp1: true
                myProp2: true
            }

    }
};
我试着像这样做,但我做错了:

    Object.keys(myObj).forEach(element => {
        if(element === "values") {
            element.forEach(innerElement => {
                if(innerElement === "internal") {
                    innerElement.myProp1= false;
                }
            });
        }
    });

有什么建议吗?

您可以像访问对象属性一样访问子对象

myObj.values.internal.myProp1 = false
注意,如果链中至少有一个元素(myProp1除外)未定义,它将抛出错误

就像@titus在评论中说的那样,你也可以使用
[…]
符号

myObj={
id:1,
价值观:{
内部:{
myProp1:错,
myProp2:对
},
外部:{
myProp1:没错,
myProp2:对
}
}
};
//使用基本符号
log(myObj.values.internal.myProp1)
//使用[…]符号按名称访问道具
日志(myObj[“值”][“内部”][“myProp1”])
//当prop名称位于变量中时,通常使用[…]表示法
让propName=“内部”
console.log(myObj[“values”][propName][“myProp1”])
//可以混合
console.log(myObj[“values”].internal[“myProp1”])

console.log(myObj.values[propName].myProp1)
我想这就是您想要的。您需要访问变量myObj本身

Object.keys(myObj).forEach(element=>{
    if(element === "values"){
        Object.keys(myObj[element]).forEach(innerElement=>{
            if (innerElement === "internal"){
                myObj[element][innerElement].myProp1 = false;
            }
        })
    }
})

如果您也接受了建议,我建议您使用数组来表示集合,而不是对象。这使得代码以比循环键和值更容易的方式查找数组中的任何内容

智能数据结构和哑代码通常比另一种方式工作得更好。 从对象到集合数组的切换极大地减少了我为转换编写的代码

const集合=[
{
“id”:1,
“内部”:[
{“name”:“myProp1”,“val”:true},
{“name”:“myProp2”,“val”:true}
],
“外部”:[
{“name”:“myProp1”,“val”:true},
{“name”:“myProp2”,“val”:true}
]
},
{
“id”:2,
“内部”:[
{“name”:“myProp1”,“val”:false},
{“name”:“myProp2”,“val”:false}
],
“外部”:[
{“name”:“myProp1”,“val”:null},
{“name”:“myProp2”,“val”:null}
]
}
];
const item_1=collection.find(item=>item.id==1);
const internal_prop=item_1.internal.find(prop=>prop.name==='myProp1');
内部_prop.val=假;

控制台日志(收集)
可以访问子对象,如访问对象prop
myObj.values.internal.myProp1=false
如果要使用字符串作为属性名,可以使用
[…]
表示法,例如:
myObj.values[innerElement].myProp1=false
。你可以找到更多的细节