嵌套对象的默认设置

问题描述

假设我有以下提供认值的对象:

default_values = {a: 0,b: 0,c: {aa: 0,bb: 0}}

我还有另一个对象将覆盖其中一些认值:

override_values = {a: 5,c: {aa: 5}}

我想要拥有的是将这两个对象结合在一起

combined: {a: 5,c: {aa: 5,bb: 0}}

但是,使用像{...default_values,...override_values}这样的常规扩展运算符只会给出c: {aa: 5}而不是c: {aa: 5,bb: 0}。该对象可能很大,因此我无法对所有嵌套对象进行硬编码。

我可以编写一个函数来基本上遍历每个键...如果值不是对象,则使用override | default,否则在嵌套对象上递归调用函数。但是我觉得这已经很普遍了。

解决方法

您正在寻找与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;
}
,

您需要深度合并。

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);