Lodash 合并:如果源值与目标值匹配,则仅复制对象属性

我有两个深层/复杂的对象合并在一起。在'addresses' 数组中需要有两个对象用于两种不同的地址类型,“PRIMARY”和“MAILING”。


在我的目标对象中,“PRIMARY” obj 位于“MAILING” obj 上方。除了源对象中只有“MAILING”obj 可用之外,一切都很好。发生这种情况时,两个对象的“addressType”属性都会被“MAILING”覆盖


// In destination obj:

addresses: [

 {

  addressType: "PRIMARY",

  addressLine1: "",

  addressLine2: "",

  city: "",

  state: "",

  zip: ""

 },

 {

  addressType: "MAILING",

  ...

 }

]


// In source obj:

addresses: [

 {

  addressType: "MAILING",

  addressLine1: "123 Main St",

  addressLine2: "",

  city: "Hawkins",

  state: "IN",

  zip: "46001"

 }

]

之后merge/当前输出(重复地址类型):


_.merge({}, destination, source); //need new object


addresses: [

     {

      addressType: "MAILING",

      addressLine1: "123 Main St",

      addressLine2: "",

      city: "Hawkins",

      state: "IN",

      zip: "46001"

     },

     {

      addressType: "MAILING",

      addressLine1: "",

      addressLine2: "",

      city: "",

      state: "",

      zip: ""

     }

    ]

期望输出:


// DESIRED OUTPUT:

addresses: [

     {

      addressType: "PRIMARY",

      addressLine1: "",

      addressLine2: "",

      city: "",

      state: "",

      zip: ""

     },

     {

      addressType: "MAILING",

      addressLine1: "123 Main St",

      addressLine2: "",

      city: "Hawkins",

      state: "IN",

      zip: "46001"

     }

    ]

来自源的地址数组可能不包含任何对象、两者都包含或一个。


所以我的问题是,如果源 obj 中只有“MAILING”,我如何防止它覆盖“PRIMARY”obj,同时留下“MAILING”(来自源)和“PRIMARY”obj(来自目标)?


我应该改用 mergeWith 吗?


慕勒3428872
浏览 260回答 1
1回答

一只名叫tom的猫

我能够使用以下自定义程序功能以及mergeWith:mergeWith({}, destination, source, customizer);const customizer = (objValue, srcValue, key) => {  if (key === "addresses") {    let merged = merge(      keyBy(objValue, "addressType"),      keyBy(srcValue, "addressType")    );    let value = values(merged);    return value;  }};
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript