使用ES6有条件地复制对象

时间:2018-12-19 04:16:48

标签: ecmascript-6 spread-syntax

可以说我有以下两个对象

object1: {
   CustomerId: 1,
   CustomerData: [1,2,3,4]
}

object2: { 
   CustomerId: 2,
   CustomerData: [11,22,33,44]
   CustomerOrders: [5,6,7,8]
}

现在我需要使用以下业务逻辑合并两个对象

如果任何一个对象都包含一个CustomerId,则该对象应覆盖另一个对象的属性。例如,如果两个对象是

object1: {
   CustomerId: 1,
   CustomerData: [1,2,3,4]
}

object2: { 
   CustomerData: [11,22,33,44]
   CustomerOrders: [5,6,7,8]
}

由于object2不包含CustomerId,因此最终合并的对象应如下所示

mergedObject: {
   CustomerId: 1,
   CustomerData: [1,2,3,4],
   CustomerOrders: [5,6,7,8]
}

注意*由于对象2缺少customerId,因此我保留了对象1而不是对象2的CustomerData。

我正在寻找使用ES6传播算子来实现这一目标。所以我会用这样的东西

const mergedObject = {...val1, ...val2}

我的问题是{}中的第一位是确定哪个对象包含customerId。目前,我有一个if条件,该条件检查是否在对象中找到了customerId,然后将其分配给object2,因为这将覆盖另一个对象。所以我有这样的东西

if (object1.customerId){
 val2 = object1;
 val1 = object2;
} else if (object2.customerId){
 val2 = object2;
 val1 = object1;
}

这是很长的时间,我认为这很丑陋,在扩展/构造函数运算符本身中,还有更好的方法吗?

const mergedObject = {...val1, ...val2} //Do it here itself

1 个答案:

答案 0 :(得分:1)

let mergedObject;

if (object1.customerId) {
    // Consider that even if both have customerId object1 override object2
    // You might want to check if (object1.customerId && !object2.customerId)
    mergedObject = {...object2, ...object1}
}
else {
    // Event if both have customerId object 2 will override object 1
    mergedObject = {...object1, ...object2}
}



// or with Ternary:
let mergedObject = object1.customerId ? {...object2, ...object1} : {...object1, ...object2}