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",

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

使用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
      }
    }
  }
}
未设置值时作为备用选项的默认选项:

{
  "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垃圾!我看错了小提琴。它按预期工作。很抱歉