在任意深度更新JS对象



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

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有足够的创造力,我可能会在对象中循环找到我需要的密钥,但有更简单的方法吗?

正如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>

我使用了lodash合并函数
首先,我必须重建我的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]
]
}
};

最新更新