Javascript嵌套对象默认回退选项
我在javascript中有一个嵌套的option对象。为它们提供默认值的最佳方式是什么 使用ajax从json文件读取的自定义javascript对象:Javascript嵌套对象默认回退选项,javascript,object,merge,nested,default,Javascript,Object,Merge,Nested,Default,我在javascript中有一个嵌套的option对象。为它们提供默认值的最佳方式是什么 使用ajax从json文件读取的自定义javascript对象: { "fields": { "markdown": { "preview": { "delay": null, "custom": "hello" }, "revisions": { "path": "revisions/markdown",
{
"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
}
}
}
}
未设置值时作为备用选项的默认选项:
{
"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
}
}
}
}
注意事项:
{
"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
}
}
}
}
- 自定义对象可能不包括所有嵌套值。如果缺少值,则应应用默认值
- Null、empty和0是可接受的值,不应被默认值覆盖
- 自定义对象中作为默认值丢失的值不会造成损害,也不需要处理
- “排列”操作符不合并嵌套对象-
- 对象指定不合并嵌套对象-
函数更新(对象,回退){
对象
.条目(回退)
.forEach([k,v])=>{
if(v&&typeof v=='object'){
更新(object[k]=object[k]| |(Array.isArray(v)?[]:{}),v);
}else如果(!(对象中的k)){
对象[k]=v;
}
});
}
var object={fields:{markdown:{preview:{delay:null,自定义:“hello”},修订:{path:“修订/标记”,限制:5}},
回退={字段:{标记:{预览:{延迟:5,css::https://example.com/my/style.css“},修订:{路径:“修订”,限制:10}};
更新(对象、回退);
console.log(对象)代码>
作为控制台包装{max height:100%!important;top:0;}
您可以使用库吗jQuery.extend()
有一个将递归的deep
选项。Lodash有。.merge()
@Barmar我不想这样做,因为我已经在Vue中使用了它。但总的来说,这是个好消息。谢谢这会将每个数组元素视为需要默认设置的属性。它可能会将整个数组视为单个值。但这就提出了如何处理对象数组的问题——它是否应该递归到对象中并合并它们?实际上,我使用每个键和值,而不是直接引用fallback
。但无论如何,这个问题只有原语和对象,里面没有阵列,@NinaScholz垃圾!我看错了小提琴。它按预期工作。很抱歉