以任意深度更新JS对象

时间:2018-07-12 14:51:33

标签: javascript

我知道我可以很简单地更新对象上的任意字段。

var simpleObj = {
    key1: 'value1',
    key2: true,
    ky3: 47
};

function updateSimpleObj(key, value){
    simpleObj[key] = value;
}

但是,如果我有一个更复杂的对象怎么办?

var funObj = {
    key1: 'value1',
    key2: simpleObj,
    key3: [1, 3, 5, 7, 9],
    key4: [{name: 'Alice', hired: true}, {name: 'Bob', hired: false}]
    key5: {
        name: table1, 
        values:[
                [0,1,2], 
                [{name: 'Alice', hired: true}, {name: 'Bob', hired: false}, {name: "Charles"}], 
                [true, false]
            ]
        }
};

我如何随意访问funObj中的任何一个嵌套值?我可以使用某种“深键”吗?
我敢肯定,如果我对LoDash有足够的创造力,那么我可能可以遍历对象来查找所需的键,但是有没有更简单的方法?

2 个答案:

答案 0 :(得分:0)

正如Trincot所说,只需使用点号和方括号表示法即可。

<script>
var simpleObj = {
    key1: 'value1',
    key2: true,
    ky3: 47
};
var funObj = {
    key: {
        name: "table1", 
        values:[
                [0,1,2], 
                [{name: 'Alice', hired: true}, {name: 'Bob', hired: false}, {name: "Charles"}], 
                [true, false]
            ]
        }
};
 var bigObj = {
 key1: "string",
 key2: {
value: {val: 0}
 }
};
console.log("BigObj: "+bigObj.key2.value.val);
console.log("FunObj: "+funObj.key.values[1][0].name);
</script>

答案 1 :(得分:0)

我使用了lodash merge函数。
首先,我不得不重建我的funObj,所以它不使用数组,仅使用对象。
对于每种可能的更新,我都需要仔细构造对象的层次结构,并仅包含所需的值。像这样:

_.merge(funObj, {
    key5: {
        values: {
            1: {
                hired: true
            }
        }
    }
}

将导致:

var funObj = {
    key1: 'value1',
    key2: simpleObj,
    key3: [1, 3, 5, 7, 9],
    key4: [{name: 'Alice', hired: true}, {name: 'Bob', hired: false}]
    key5: {
        name: table1, 
        values:[
                [0,1,2], 
                [{name: 'Alice', hired: true}, {name: 'Bob', hired: true}, {name: "Charles"}], 
                [true, false]
            ]
        }
};