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')
仅保留子项上存在的父项。更新了两个示例。酷!祝你一切顺利,我已经把问题澄清了一点。我相信很多人会觉得这很有用