默认情况下Javascript简单对象覆盖

默认情况下Javascript简单对象覆盖,javascript,performance,Javascript,Performance,bsd 我有一个简单的对象,我想用另一个对象覆盖它,如果对象中不存在某些属性,它应该取自默认的预设对象,可能是深度嵌套的 下面是默认设置对象的示例 defaults = { name : 'Joe', options : { color : 'green', dates : { from : new Date, to : new Date, } } } 这里是提供的对象 settings = {

bsd

我有一个简单的对象,我想用另一个对象覆盖它,如果对象中不存在某些属性,它应该取自默认的预设对象,可能是深度嵌套的

下面是默认设置对象的示例

defaults = {
   name : 'Joe',
   options : {
      color : 'green',
      dates : {
         from : new Date,
         to   : new Date,
      }
   }
}
这里是提供的对象

settings = {
   name : 'David',
   options : {
      color : 'purple'
   }
}
这是预期的结果,两者的结合

final = {
   name : 'David',
   options : {
      color : 'purple',
      dates : {
         from : new Date,
         to   : new Date,
      }
   }
}
有没有一种简单的方法可以在不使用任何外部库的情况下实现这一点?我尝试了一些方法(
JSON.stringify/parse
/迭代对象/etc…),但没有得到一个干净的解决方案。。。希望是一条单行线

非常感谢您的帮助……

您可以查看


如果默认值已更改,则可以手动设置每个值

final = {
      name : settings.name ? settings.name : "Joe",
      options {
        color: settings.color ? settings.color : "green",
        dates: {
          from : settings.dates.from ? settings.dates.from : new Date,
          to: settings.dates.to ? settings.dates.to : new Date
        }
      }
    }
这可能最有效:

var final = Object.assign({}, default, settings);
使用此
$.extend(true、{}、默认值、设置)
。注意json变量的顺序。在这种情况下,如果这两个变量具有相同的属性,
设置
将覆盖
默认值

如果您正在研究纯JS,请回答。这是代码

function extend(a, b){
    for (var key in b) {
        if (b.hasOwnProperty(key))
            a[key] = b[key];
            return a;
        }
    }
}
console.log(extend(defaults,settings));

这是我的贡献

需要注意的是,由于对象的
复制的性质,代码相当长

使用
Object.assign(默认值、设置)
将合并您的对象,但在执行对象的浅复制时,您的
date
键将被删除

下面,我使用了一个名为的用户在上面找到的代码片段,它执行对象的
深度
合并,并且是
不可变的
(不编辑原始数组)


let defaults={
名字:'乔',
选项:{
颜色:“绿色”,
日期:{
起始日期:新日期(),
收件人:新日期(),
}
}
};
让设置={
姓名:'大卫',
选项:{
颜色:“紫色”
}
};
函数mergeDeep(…对象){
const isObject=obj=>obj&&typeof obj==='object';
返回对象。减少((上一个,对象)=>{
Object.keys(obj.forEach)(key=>{
const pVal=上一个[键];
const oVal=obj[key];
if(Array.isArray(pVal)和&Array.isArray(oVal)){
上一个[键]=pVal.concat(…椭圆形);
}其他if(等高线(pVal)和等高线(椭圆形)){
prev[key]=mergeDeep(pVal,椭圆形);
}否则{
前[键]=椭圆形;
}
});
返回上一个;
}, {});
}
让final=mergeDeep(默认值、设置);

控制台日志(最终)日期未指定。这些答案是否有帮助:
jQuery
未包含在标记中,因此请在您的帖子中通知您正在使用
jQuery
:)我明白了。但是OP确实说OP尝试使用了
JSON.stringify
JSON.stringify
jQuery
无关,它是
VanillaJS
功能。您的答案是正确的,只需指出它使用了一个库:)更新的答案希望这有帮助
function extend(a, b){
    for (var key in b) {
        if (b.hasOwnProperty(key))
            a[key] = b[key];
            return a;
        }
    }
}
console.log(extend(defaults,settings));