嵌套对象的默认设置

时间:2020-08-18 06:35:19

标签: javascript object default-value

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

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,否则在嵌套对象上递归调用此函数。但是我觉得这已经很普遍了。

2 个答案:

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