【问题标题】:Javascript nested objects default fallback optionsJavascript 嵌套对象默认回退选项
【发布时间】:2019-09-13 06:31:32
【问题描述】:

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

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

{
  "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
      }
    }
  }
}

注意事项:

  • 自定义对象可能不包括所有嵌套值。如果缺少值,则应应用默认值。
  • Null、empty 和 0 是可接受的值,不应被默认值覆盖。
  • 自定义对象中缺少默认值的值不会造成任何损害,也不需要处理。

我到目前为止所做的尝试

【问题讨论】:

  • 你可以使用图书馆吗? jQuery.extend() 有一个 deep 将递归的选项。 Lodash 有_.merge()
  • @Barmar 我不想这样做,因为我已经在 Vue 中使用了它。但总的来说,这是很好的信息。谢谢!

标签: javascript object merge nested default


【解决方案1】:

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

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

【讨论】:

  • 这会将每个数组元素视为需要默认的属性。它可能应该将整个数组视为单个值。
  • 但这提出了如何处理对象数组的问题——它是否应该递归到对象中并合并它们?
  • 实际上我使用每个键和值而不是直接引用fallback
  • 但无论如何这个问题只有原语和对象,里面没有数组,
  • @NinaScholz 废话!我读错了我的小提琴。它按预期工作。对不起!
猜你喜欢
  • 2014-08-12
  • 2020-12-07
  • 2018-12-12
  • 1970-01-01
  • 2020-04-09
  • 2017-12-09
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多