如果第二个对象中不存在两个对象,则合并两个对象并保留第一个对象的属性[重复]

Posted

技术标签:

【中文标题】如果第二个对象中不存在两个对象,则合并两个对象并保留第一个对象的属性[重复]【英文标题】:Merge two objects with keeping the properties of the first object if they are not existing in the second object [duplicate] 【发布时间】:2019-11-18 00:18:09 【问题描述】:

我在这里需要帮助,因为我找不到合适的解决方案: 我有两个对象:

obj1 = 
    name: '112',
    surname:  test: '123', other: '124' ,
    age: 151,
    height: '183',
    weight: 80
  ;

obj2 = 
    name: '114',
    surname:  test: '124' ,
    age: 151,
    height: 184,
    weight: 81
  ;

新对象必须有这个输出:

new = 
        name: '114',
        surname:  test: '124', other: '124' ,
        age: 151,
        height: 184,
        weight: 81
      ;

您可以看到在 surname 属性中保留了其他属性: 我已经尝试过类似的方法,但它不起作用,必须有一个更简单的解决方案:

const newObje = Object.keys(obj2).reduce(newObj, key) => 
    if (typeof (obj2[key]) === 'string' || obj2[key] === 'number') 
      newObj[key] = obj2[key];
    
    if (typeof (obj2[key]) === 'object' || obj2[key] === 'array') 

    
  

【问题讨论】:

你试过(...传播运算符?) 如果您的对象可以任意深,您将需要递归解决方案。 ***.com/a/21450110/4051471 正如@TirthrajRao 提到的,您可以使用扩展运算符newObj = ...obj1,...obj2 ... 如果您只需要使用给定的结构:let res = Object.assign(obj2, surname: Object.assign(obj1.surname, obj2.surname)) 或更短:let res = ...obj2, surname: ...obj1.surname, ...obj2.surname 【参考方案1】:

您可以使用合并函数并用最后一个值覆盖值。

function merge(...objects) 
    function m(t, s) 
        Object.entries(s).forEach(([k, v]) => 
            t[k] = v && typeof v === 'object' ? m(t[k] || , v) : v;
        );
        return t;
    

    return objects.reduce(m, );


var obj1 =  name: '112', surname:  test: '123', other: '124' , age: 151, height: '183', weight: 80 ,
    obj2 =  name: '114', surname:  test: '124' , age: 151, height: 184, weight: 81 ,
    result = merge(obj1, obj2);

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

【参考方案2】:

你可以使用lodash.merge

_.merge(obj1 , obj2)

如您在文档中所见,它将深度合并两个对象

此方法类似于 _.assign ,不同之处在于它递归地将源对象的自己的和继承的可枚举字符串键控属性合并到目标对象中。如果存在目标值,则跳过解析为未定义的源属性。数组和普通对象属性递归合并。其他对象和值类型被赋值覆盖。源对象从左到右应用。后续来源会覆盖先前来源的属性分配。

    let obj1 = 
        name: '112',
        surname:  test: '123', other: '124' ,
        age: 151,
        height: '183',
        weight: 80
      ;
      
    let obj2 = 
        name: '114',
        surname:  test: '124' ,
        age: 151,
        height: 184,
        weight: 81
      ;
      
let newObj = _.merge(obj1, obj2)

console.log(newObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

【讨论】:

以上是关于如果第二个对象中不存在两个对象,则合并两个对象并保留第一个对象的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

EffectiveJava——用函数对象表示策略

T-SQL:比较两个表 - 第二个表中不存在的记录

检查列表中的对象是不是存在,如果在 R 中不存在则将其删除

Javascript |使用Object.assign()合并两个对象数组?

打字稿,合并对象类型?

对第二个表中不存在 ID 的两个表的 MySQL 查询优化