Javascript 如何合并两个对象,覆盖空值?

Javascript 如何合并两个对象,覆盖空值?,javascript,merge,lodash,Javascript,Merge,Lodash,我想合并两个相似但不完全相同的对象,并覆盖其中一个对象中的空值(如果存在)。例如,我有两个对象: const obj1 = { a: 1, b: '', c: [], d: null } const obj2 = { a: 2, b: null, d: 1 } 合并的效果应该是: const objMerged = { a: 2, b: '', c: [], d: 1 } 换句话说,合并对象中最重要的数

我想合并两个相似但不完全相同的对象,并覆盖其中一个对象中的空值(如果存在)。例如,我有两个对象:

const obj1 = {
    a: 1,
    b: '',
    c: [],
    d: null
}

const obj2 = {
    a: 2,
    b: null,
    d: 1
}
合并的效果应该是:

const objMerged = {
    a: 2,
    b: '',
    c: [],
    d: 1
}
换句话说,合并对象中最重要的数据源是
obj2
,但它缺少
obj1
中的一些属性,因此需要复制这些属性,而且一些
obj2
值是
null
,因此也应该从
obj1
中获取

编辑 我试过:


如果您只对两个对象中的第一级感兴趣,可以执行以下操作:

const obj1={
答:1,,
b:“,
c:[],
d:空
}
常数obj2={
答:2,,
b:空,
d:1
}
const merged=Object.keys(obj1).concat(Object.keys(obj2))//创建一个包含两个对象的键的数组。
.filter((k,i,arr)=>arr.indexOf(k)==i)//删除重复键
.减少((a,c)=>{
a[c]=obj1[c]!==null?obj1[c]:obj2[c];
返回a;
}, {});

console.log(合并)
您使用
对象做得很好。分配
,只需删除之前不需要的内容

Object.keys(obj1).forEach( k => {
    if ( obj1[k] //write the condition you want
        delete obj1[k]
});
您可以使用,并且在合并回调中,如果第二个值不是
null
,则只接受该值:

const obj1={a:1,b:'',c:[],d:null}
常量obj2={a:2,b:null,d:1}
const result=\.mergeWith({},obj1,obj2,(o,s)=>\.isNull(s)?o:s)
console.log(结果)
通过和使用Lodash

const obj1={“a”:1,“b”:“c”:[],“d”:null}
常量obj2={“a”:2,“b”:null,“d”:1}
const objMerged=uzy.create(
_.ommitby(obj1,0.isNull),
_.omitBy(obj2,0.isNull)
)
console.log(objMerged)

这里是一个纯基于JS的解决方案:

迭代第一个对象以替换第二个对象中的值,然后添加第二个对象中的附加值

const obj1={
答:1,,
b:“,
c:[],
d:空
}
常数obj2={
答:2,,
b:空,
d:1
}
函数mergeObjs(obj1、obj2){
const merged={}
keys1=对象键(obj1);
键1.forEach(k1=>{
合并的[k1]=obj2[k1]| | obj1[k1];//替换第二个对象中的值(如果有)
})
Object.keys(obj2).forEach(k2=>{
如果(!keys1.includes(k2))合并[k2]=obj[k2];//从第二个对象添加其他属性(如果有)
})
返回合并
}
console.log(mergeObjs(obj1,obj2))

//打印对象合并显示

您还可以与和混合搭配。省略:

const obj1={a:1,b:'',c:[],d:null}
常量obj2={a:2,b:null,d:1}
常量结果={…。.omitBy(obj1,。.isNull),…。.omitBy(obj2,。.isNull)}
console.log(结果)

要添加到这个好答案列表中,这里有一个可以使用嵌套结构的递归解决方案

此示例将在所有嵌套级别中将
dst
对象的公共属性合并到
src
对象中,保留所有非公共属性不变

const merge=(dst,src)=>{
Object.keys(src.forEach)((key)=>{
如果(!dst[key]){
dst[key]=src[key];
}否则,如果(src[key]的类型=='object'和&src[key]!==null和&typeofdst[key]=='object'和&dst[key]!==null){
合并(dst[key],src[key]);
}
});
},
/*用法:*/
src={
建议一:"1",,
提案2:{
瓦尔:2,
}
},
dst={
prop1:null,
提案2:{
val:null,
},
prop3:null,
};
合并(dst、src);

控制台日志(dst)在询问之前是否尝试过任何操作?是的,Object.assign和lodash extend函数。能否在questionObject.assign({},obj1,obj2)中包含您的尝试;请用您的两个尝试性答案编辑问题。我真的很喜欢这个解决方案!合并[k2]=obj[k2]需要合并[k2]=obj2[k2]
Object.assign({}, obj1, obj2)
Object.keys(obj1).forEach( k => {
    if ( obj1[k] //write the condition you want
        delete obj1[k]
});
var objMerged  = {};
for (var kobj1 in obj1) {
    for (var kobj2 in obj2) {
        if (obj1[kobj1] == null && obj2[kobj1] != null)
            objMerged[kobj1] = obj2[kobj1];
        else if (obj2[kobj2] == null && obj1[kobj2] != null)
            objMerged[kobj2] = obj1[kobj2];

    }
}