具有这种形式的对象:
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;
}
});
}
});
有什么建议吗?
答案 0 :(得分:2)
您可以访问子对象,就像访问对象道具
myObj.values.internal.myProp1 = false
请注意,如果未定义链中的至少一个元素(myProp1
除外),则将抛出错误
就像@titus在评论中说的那样,您也可以使用[...]
表示法
myObj = {
id: 1,
values: {
internal: {
myProp1: false,
myProp2: true
},
external: {
myProp1: true,
myProp2: true
}
}
};
// using basic notation
console.log(myObj.values.internal.myProp1)
// using [...] notation to access prop by name
console.log(myObj["values"]["internal"]["myProp1"])
// the [...] notation is generally used when the prop name is in a variable
let propName = "internal"
console.log(myObj["values"][propName]["myProp1"])
// can be mixed
console.log(myObj["values"].internal["myProp1"])
console.log(myObj.values[propName].myProp1)
答案 1 :(得分:0)
我想这就是你想要的。您需要访问变量myObj本身。
Object.keys(myObj).forEach(element=>{
if(element === "values"){
Object.keys(myObj[element]).forEach(innerElement=>{
if (innerElement === "internal"){
myObj[element][innerElement].myProp1 = false;
}
})
}
})
答案 2 :(得分:0)
如果您也有建议,我建议您使用数组来表示集合而不是对象。这样一来,与循环遍历键和值相比,代码更容易在数组内部查找内容。
智能数据结构和哑代码通常比其他方法更有效。 从对象切换到数组进行收集,大大减少了我为转换编写的代码。
const collection = [
{
"id": 1,
"internal": [
{ "name": "myProp1", "val": true },
{ "name": "myProp2", "val": true }
],
"external": [
{ "name": "myProp1", "val": true },
{ "name": "myProp2", "val": true }
]
},
{
"id": 2,
"internal": [
{ "name": "myProp1", "val": false },
{ "name": "myProp2", "val": false }
],
"external": [
{ "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' );
internal_prop.val = false;
console.log( collection );