javascript - 如何根据目标对象的键合并javascript中的两个嵌套对象?
问题描述
我有两个对象,一个可以被认为是超集,另一个可以被认为是子集。子集保证与超集具有相似的结构,只是子集将缺少超集中的某些属性。
var superset = {
car: {
type: 'SUV',
brand: 'Volvo',
color: 'Black'
},
features: {
interior: {
seats: 'leather',
color: 'black'
},
exterior: {
windows: 'tinted'
},
doors: 5
},
warranty: '5 yrs'
}
var subset = {
car: {
type: true,
brand: true
},
features: {
interior: {
seats: true
},
exterior: {
windows: true
},
doors: true
}
}
我想合并这两个对象,使用超集中的值,但仅用于子集中存在的属性。结果应如下所示:
{
car: {
type: 'SUV',
brand: 'Volvo'
},
features: {
interior: {
seats: 'leather'
},
exterior: {
windows: 'tinted'
},
doors: 5
}
}
mergeWith
来自 Lodash 的几乎可以完成这项工作,但它似乎只适用于如下所示的第一级属性。想法是,一旦我为所有不需要的属性分配了唯一值,我就可以循环遍历并在以后摆脱它们。
_.mergeWith(subset, superset, function(a, b) {return a ? b : 'DELETE'})
Result:
{
car: {
type: 'SUV',
brand: 'Volvo',
color: 'Black'
},
features: {
interior: {
seats: 'leather',
color: 'black'
},
exterior: {
windows: 'tinted'
},
doors: 5
},
warranty: 'DELETE'
}
任何帮助表示赞赏。
解决方案
这个解决方案只是遍历subset
(我称之为schema
)并从(我称之为)复制值superset
(input
如果它们存在)。如果一个值在两者中都是对象,则函数调用自身来处理嵌套属性:
function merge(input, schema) {
var result = {}
for (var k in schema) {
if (input[k] && typeof input[k] === 'object' && schema[k] && typeof schema[k] === 'object') {
result[k] = merge(input[k], schema[k])
} else if (k in input) {
result[k] = input[k]
}
}
return result
}
var superset = {
car: {
type: 'SUV',
brand: 'Volvo',
color: 'Black'
},
features: {
interior: {
seats: 'leather',
color: 'black'
},
exterior: {
windows: 'tinted'
},
doors: 5
},
warranty: '5 yrs'
}
var subset = {
car: {
type: true,
brand: true
},
features: {
interior: {
seats: true
},
exterior: {
windows: true
},
doors: true
}
}
var result = merge(superset, subset)
console.log(result)
推荐阅读
- spring - Spring Cloud 配置服务器不尊重 logging.file 属性并且不记录外部文件
- javascript - 当按下空格键而不是按钮时,Reactjs用keydown触发按钮
- javascript - 显示组件中函数返回的值
- flutter - Dart 将简单类转换为扩展
- java - 如何更改数组的值以便再次输出
- database - MongoDB Mac 安装
- python - 如何使用 group by 多列从 pandas 中随机选择 n 行,每个组的最小和最大计数
- python-3.x - Python3 替换 ord() 和 chr()
- windows - 在 Windows 中同时从多个 USB 麦克风捕获音频
- c++ - C++ | 重载运算符 << | 标准::地图