1

具有这种形式的对象:

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;
                }
            });
        }
    });

有什么建议么?

4

3 回答 3

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)

于 2018-08-29T15:01:30.907 回答
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 );

于 2018-08-29T15:44:04.973 回答
0

我想这就是你想要的。您需要访问变量 myObj 本身。

Object.keys(myObj).forEach(element=>{
    if(element === "values"){
        Object.keys(myObj[element]).forEach(innerElement=>{
            if (innerElement === "internal"){
                myObj[element][innerElement].myProp1 = false;
            }
        })
    }
})
于 2018-08-29T15:09:18.130 回答