Javascript Lodash按键查找并合并,同时保留特定的键值

Javascript Lodash按键查找并合并,同时保留特定的键值,javascript,reactjs,lodash,Javascript,Reactjs,Lodash,我有两个集合,“父”集合和“子”集合 我需要: 按ctaTypeNameUID查找父项中的子项 如果子对象值不为null,则子对象应覆盖父对象 遵守孩子的秩序 仅保留子项上存在的父项+子项中的自定义项 父对象 "parentObjectOverrideable": [{ "cta_type": { "title": null, "ctaTypeNameUID": "

我有两个集合,“父”集合和“子”集合

我需要:

  • 按ctaTypeNameUID查找父项中的子项

  • 如果子对象值不为null,则子对象应覆盖父对象

  • 遵守孩子的秩序

  • 仅保留子项上存在的父项+子项中的自定义项

父对象

"parentObjectOverrideable": [{
    "cta_type": {
      "title": null,
      "ctaTypeNameUID": "enjoy-new-york",
      "form-url": "F-2009",
      "city": "New York",
      "address": null
    }
  },
  {
    "cta_type": {
      "title": null,
      "ctaTypeNameUID": "enjoy-london",
      "form-url": "F-2010",
      "city": "London",
      "address": null
    }
  }

]
"childObject": [{
    "cta_type": {
      "title": "Enjoy London",
      "ctaTypeNameUID": "enjoy-london",
      "form-url": "F-2009",
      "city": null,
      "address": null
    }
  },
  {
    "cta_type": {
      "title": "Enjoy New York",
      "ctaTypeNameUID": "enjoy-new-york",
      "form-url": "F-22827166628",
      "city": null,
      "address": null
    }
  },
]
子对象

"parentObjectOverrideable": [{
    "cta_type": {
      "title": null,
      "ctaTypeNameUID": "enjoy-new-york",
      "form-url": "F-2009",
      "city": "New York",
      "address": null
    }
  },
  {
    "cta_type": {
      "title": null,
      "ctaTypeNameUID": "enjoy-london",
      "form-url": "F-2010",
      "city": "London",
      "address": null
    }
  }

]
"childObject": [{
    "cta_type": {
      "title": "Enjoy London",
      "ctaTypeNameUID": "enjoy-london",
      "form-url": "F-2009",
      "city": null,
      "address": null
    }
  },
  {
    "cta_type": {
      "title": "Enjoy New York",
      "ctaTypeNameUID": "enjoy-new-york",
      "form-url": "F-22827166628",
      "city": null,
      "address": null
    }
  },
]
我试过使用Lodash的_mergeWith

const result = _.mergeWith([], parentObjectOverrideable, childObject, (a, b) =>
  b === null || b === '' ? a : undefined
)
问题是,如果cta_类型在子对象上的位置不同,它也会覆盖UID,因此您会得到如下结果:

"parentObjectOverrideable": [{
    "cta_type": {
      "title": "Enjoy London",
      ,
      "ctaTypeNameUID": "enjoy-new-york",
      "form-url": "F-2009"
      "city": null "address": null
    }
  },
  {
    "cta_type": {
      "title": "Enjoy New York",
      "ctaTypeNameUID": "enjoy-london",
      "form-url": "F-2010",
      "city": null,
      "address": null
    }
  }

]
我也尝试过这样做

const overrideObject = (objA, objB) => {
  const newObject = { ...objB
  }

  Object.keys(objA).forEach((key) => {
    if (objA[key]) {
      newObject[key] = objA[key]
    }
  })

  console.log(newObject)
}

你知道怎么做吗?

将项目合并到一个数组中,将其分组
cta\u type.ctaTypeNameUID
,然后将每个组合并到一个对象中,让
\uu.mergeBy()
处理对象和数组的合并,并使用
a
处理原语,除非
为null
,而且
b
不是
未定义的

const{flow,concat,groupBy,flatMap,mergeWith,isObject,isUndefined,isNull,intersectionBy}=_
常数fn=流量(
康卡特,
arr=>groupBy(arr,'cta_type.ctaTypeNameUID'),
groups=>flatMap(groups,group=>mergeWith({},…group,(a,b,k)=>{
if(isObject(a)| | isObject(b))返回未定义
return!isUndefined(b)和&isNull(a)?b:a
})),
)
const ParentObjectOverridable=[{“cta_类型”:{“标题”:null,“ctaTypeNameUID”:“享受纽约”,“表格url”:“F-2009”,“城市”:“纽约”,“地址”:null},{“cta_类型”:{“标题”:null,“ctaTypeNameUID”:“享受伦敦”,“表格url”:“F-2010”,“城市”:“伦敦”,“地址”:null}]
const childObject=[{“cta_类型”:{“标题”:“享受伦敦”,“ctaTypeNameUID”:“享受伦敦”,“表格url”:“F-2009”,“城市”:null,“地址”:null},{“cta_类型”:{“标题”:“享受纽约”,“ctaTypeNameUID”:“享受纽约”,“表格url”:“F-22827166628”,“城市”:null,“地址”:null}]
常数结果=fn(
childObject,
intersectionBy(ParentObjectOverridable,childObject,'cta_type.ctaTypeNameUID')
)
console.log(结果)

就像一个符咒!但愿我能给你一杯啤酒,哈哈。如何保持子对象的顺序?我选择了第一个选项。第一个数组决定顺序。您可以更改馈送到函数的数组的顺序,这样子数组将是第一个数组,并反转合并中的逻辑以获取
a
中的值,只要它不是
null
。在合并两个数组之前,请使用
.intersectionBy(child,parent,'cta\u type.ctaTypeNameUID')
仅保留子项上存在的父项。更新了两个示例。酷!祝你一切顺利,我已经把问题澄清了一点。我相信很多人会觉得这很有用