javascript - 在 JavaScript 中合并多维对象
问题描述
默认对象
var default_obj = {
"cloud": {
"something_1": {
"view": false,
"create": false
},
"something_2": {
"view": false,
"create": false
},
"something_3": {
"view": false,
"create": false
},
}
}
要合并的对象
var merge_obj = {
"cloud": {
"something_1": {
"view": true,
"create": true
},
"something_2": {
"view": false,
"create": false
}
}
}
合并后
var merge_obj = {
"cloud": {
"something_1": {
"view": true,
"create": true
},
"something_2": {
"view": false,
"create": false
}
"something_3": {
"view": false,
"create": false
}
}
}
我基本上希望第二个对象覆盖默认对象中的所有内容,但是,如果在第二个对象中找不到默认对象中的新信息,则将其包含在内。
只是通过{ ...default_obj, ...merge_obj }
为覆盖的第一部分做工作,但它遗漏了something_3
编辑
只是想注意,对象不会总是保持view
,或者create
它可能真的是任何东西,但它永远不会在维度上更深。
解决方案
此函数将在两个对象之间进行合并。
function merge(obj, src) {
Object.keys(src).forEach(function(key) {
if (typeof src[key] === 'object') {
if (typeof obj[key] === 'undefined') obj[key] = {};
obj[key] = merge(obj[key], src[key]);
} else {
obj[key] = src[key];
}
});
return obj;
}
merge(default_obj, merge_obj)
但是有像 lodash 这样的可用库已经做到了。例子:
_.merge(default_obj, merge_obj);
推荐阅读
- jmeter - 如何使用 Jmeter 在循环中运行 2 个线程组?
- vba - 如何修复 Form.Recordset 中的“无当前记录”-错误?
- arrays - for ... in 循环是否遍历序列的副本?
- php - Sylius - Shop Api - 当 shop API 运行时发生错误找不到模板“”
- python - 将存储在元组中的坐标字符串转换为列表
- azure - 用于监视 Azure VM 的逻辑应用程序未发送预期的电子邮件
- php - 未知数据库类型枚举请求学说
- c# - 删除和创建具有相同名称的新/覆盖文件 c# .NET
- oracle - 为什么更改通知不支持以下查询?
- angular - Firebase CommonJS 或 AMD 依赖项可能导致优化救助