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
}
}
}
}
备注:
- 自定义对象可能不包含所有嵌套值。如果缺少值,则应应用默认值。
- Null、空和 0 是可接受的值,不应被默认值覆盖。
- 自定义对象中作为默认值缺失的值没有危害,不需要处理。
我到目前为止所做的努力
- 展开运算符不合并嵌套对象 - https://flaviocopes.com/how-to-merge-objects-javascript/
- 对象分配不合并嵌套对象 - How can I merge properties of two JavaScript objects dynamically?
您可以通过检查对象的值(如果是对象)并检查嵌套对象或如果键不存在则分配值来采用递归方法。
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; }
我在 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
}
}
}
}
备注:
- 自定义对象可能不包含所有嵌套值。如果缺少值,则应应用默认值。
- Null、空和 0 是可接受的值,不应被默认值覆盖。
- 自定义对象中作为默认值缺失的值没有危害,不需要处理。
我到目前为止所做的努力
- 展开运算符不合并嵌套对象 - https://flaviocopes.com/how-to-merge-objects-javascript/
- 对象分配不合并嵌套对象 - How can I merge properties of two JavaScript objects dynamically?
您可以通过检查对象的值(如果是对象)并检查嵌套对象或如果键不存在则分配值来采用递归方法。
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; }