Javascript 嵌套对象默认回退选项

Javascript nested objects default fallback options

我在 javascript 中有一个嵌套的选项对象。为它们提供默认值的最佳方式是什么?

自定义 javascript 对象从 json 文件读取 ajax:

{
  "fields": {
    "markdown": {
      "preview": {
        "delay": null,
        "custom": "hello"
      },
      "revisions": {
        "path": "revisions/markdown",
        "limit": 5
      }
    }
  }
}

如果未设置值,则默认选项作为回退:

{
  "fields": {
    "markdown": {
      "preview": {
        "delay": 5,
        "css": "https://example.com/my/style.css"
      },
      "revisions": {
        "path": "revisions",
        "limit": 10
      }
    }
  }
}

预期结果

保留自定义对象的所有内容并使用默认值完成它,"css" 在本例中。

{
  "fields": {
    "markdown": {
      "preview": {
        "delay": null,
        "css": "https://example.com/my/style.css",
        "custom": "hello"
      },
      "revisions": {
        "path": "revisions/markdown",
        "limit": 5
      }
    }
  }
}

备注:

我到目前为止所做的努力

您可以通过检查对象的值(如果是对象)并检查嵌套对象或如果键不存在则分配值来采用递归方法。

function update(object, fallback) {
    Object
        .entries(fallback)
        .forEach(([k, v]) => {
            if (v && typeof v === 'object') {
                update(object[k] = object[k] || (Array.isArray(v) ? [] : {}), v);
            } else if (!(k in object)) {
                object[k] = v;
            }
        });
}

var object = { fields: { markdown: { preview: { delay: null, custom: "hello" }, revisions: { path: "revisions/markdown", limit: 5 } } } },
    fallback = { fields: { markdown: { preview: { delay: 5, css: "https://example.com/my/style.css" }, revisions: { path: "revisions", limit: 10 } } } };

update(object, fallback);

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }