假设我有以下提供默认值的对象:
default_values = {a: 0, b: 0, c: {aa: 0, bb: 0}}
我还有另一个对象将覆盖其中一些默认值:
override_values = {a: 5, c: {aa: 5}}
我想要拥有的是将这两个对象结合在一起
combined: {a: 5, b: 0, c: {aa: 5, bb: 0}}
但是,使用像{...default_values, ...override_values}
这样的常规扩展运算符只会给出c: {aa: 5}
而不是c: {aa: 5, bb: 0}
。该对象可能很大,因此我无法对所有嵌套对象进行硬编码。
我可以编写一个函数来基本上遍历每个键...如果值不是对象,则使用override | default
,否则在嵌套对象上递归调用此函数。但是我觉得这已经很普遍了。
答案 0 :(得分:0)
您正在寻找与deep_merge或merge相似的东西。
这些功能已广泛使用,并在lodash
库中提供。
这里是一个例子:-
function merge(target, source) {
Object.keys(source).forEach(key => {
const sourceValue = source[key];
if (sourceValue) {
const targetValue = target[key];
const newValues = merge(targetValue, sourceValue);
Object.assign(sourceValue, newValues);
}
});
Object.assign(target || {}, source);
return target;
}
答案 1 :(得分:0)
您需要深度合并。
const
isObject = o => o && typeof o === 'object',
merge = (a, b) => {
Object
.entries(b)
.forEach(([k, v]) => a[k] = isObject(v) ? merge(a[k] || {}, v) : v);
return a;
},
default_values = { a: 0, b: 0, c: { aa: 0, bb: 0 } },
override_values = { a: 5, c: { aa: 5 } },
result = merge(default_values, override_values);
console.log(result);