深度合并两个javascript对象lodash/香草

深度合并两个javascript对象lodash/香草,javascript,lodash,Javascript,Lodash,我正在尝试合并两个包含对象的对象..其中包含一个对象数组..你明白了。但是,我的代码没有产生期望的结果,我不明白为什么…可能是因为我刚刚开始使用lodash,我遗漏了一些明显的东西 这里有两个我想合并的对象 var original = { a: "bbbb", Id: 1, b: { a: "bbb", Id: 2 }, c: "aaa", d: [ { a

我正在尝试合并两个包含对象的对象..其中包含一个对象数组..你明白了。但是,我的代码没有产生期望的结果,我不明白为什么…可能是因为我刚刚开始使用lodash,我遗漏了一些明显的东西

这里有两个我想合并的对象

 var original = { 
    a: "bbbb", 
    Id: 1, 
    b: { 
        a: "bbb", 
        Id: 2 
    }, 
    c: "aaa",
    d: [
        { 
            a: "bbbb", 
            Id: 1, 
            b: { 
                a: "bbb", 
                Id: 2 
            }, 
            c: "aaa"
        },
        { 
            a: "bbbb", 
            Id: 2, 
            b: { 
                a: "bbb", 
                Id: 3 
            }, 
            c: "aaa" 
        }
    ] 
};

var source = { 
    a: "aaa", 
    Id: 1, 
    b: { 
        a: "aaa", 
        Id: 2 
    }, 
    c: null, 
    d: [
        { 
            a: "aaa", 
            Id: 1, 
            b: { 
                a: "aaa", 
                Id: 2 
            }, 
            c: null
        },
        { 
            a: "aaa", 
            Id: 2, 
            b: { 
                a: "aaa", 
                Id: 3 
            }, 
            c: null 
        }
    ] 
};
结果对象应仅包含aaa作为值,而不包含null。从源获取值,除非它为null并且不复制数组,而是合并数组中的对象。。我的代码很好地合并了对象……但是,当它到达对象数组时,它无法生成正确的结果

结果应该是:

{"a":"aaa",
 "Id":1,
 "b":
    {
     "a":"aaa",
     "Id":2
    },
    "c":"aaa",
   "d":
     [
      {
       "a":"aaa",
       "Id":1,
        "b":
         {
         "a":"aaa",
         "Id":2
         },
        "c":"aaa"
     },
{ a:aaa, Id:2, b: { a:aaa, 身份证号码:3 }, c:aaa } ]}

这是我的密码:


谢谢大家!

您可以迭代对象的键,并仅在目标值为空时更新

函数更新源,目标{ Object.keysource.foreachk函数{ 如果目标[k]==null{ 目标[k]=源[k]; 回来 } 如果源[k]&&typeof源[k]=='object'{ 更新源[k],目标[k]; } }; } var source={a:bbbb,Id:1,b:{a:bbb,Id:2},c:aaa,d:[{a:bbbbb,Id:1,b:{a:bbb,Id:2},c:aaa},{a:bbb,Id:2,b:{a:bbb,Id:3},c:aaa}, target={a:aaa,Id:1,b:{a:aaa,Id:2},c:null,d:[{a:aaa,Id:1,b:{a:aaa,Id:2},c:null},{a:aaa,Id:2,b:{a:aaa,Id:3},c:null}; 更新资源、目标; console.logtarget;
.作为控制台包装{max height:100%!important;top:0;}我将您的代码编辑为可读。您能否以相同的格式添加所需的结果?仍然不确定我的小提琴是否符合你的要求。根据你所说的,我认为这是你想要的结果:我意识到我忘记在第一次发送小提琴之前保存它。请告诉我这对您是否正确,因为它更喜欢使用源值覆盖任何属性。如果需要,可以跳过对空值的覆盖,因为它们没有用处。这样做:是的,你必须在每个子对象上运行相同的函数。这有点递归,但我会告诉你。