对象的对象的访问属性

时间:2018-08-29 14:57:32

标签: javascript object ecmascript-6 key

具有这种形式的对象:

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

    }
};

我希望能够在选择一个选项internalexternal时,仅对我选择的一个选项将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;
                }
            });
        }
    });

有什么建议吗?

3 个答案:

答案 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 );