JavaScript:仅将2个对象数组的差异/更改合并到新的对象数组中
我需要一些帮助。如何将2个对象数组的差异/更改合并到新的对象数组中 用例1:JavaScript:仅将2个对象数组的差异/更改合并到新的对象数组中,javascript,Javascript,我需要一些帮助。如何将2个对象数组的差异/更改合并到新的对象数组中 用例1: const oldMeta = [ { fieldName: "item", fieldLabel: "Item" }, { fieldName: "location", fieldLabel: "Location", displayLabel: "Place" }, { fieldName: "
const oldMeta = [
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "createdDate", fieldLabel: "Created Date", displayLabel: "C Date" },
{ fieldName: "owner", fieldLabel: "Owner" },
{ fieldName: "status", fieldLabel: "Status" },
];
const newMeta = [
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location" },
{ fieldName: "city", fieldLabel: "City" },
{ fieldName: "createdDate", fieldLabel: "Creation Date" },
{ fieldName: "ownerName", fieldLabel: "Owner" },
{ fieldName: "severity", fieldLabel: "Severity" },
{ fieldName: "status", fieldLabel: "Status" },
];
我希望输出为:
[
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "city", fieldLabel: "City" },
{ fieldName: "createdDate", fieldLabel: "Creation Date", displayLabel: "C Date" },
{ fieldName: "ownerName", fieldLabel: "Owner" },
{ fieldName: "severity", fieldLabel: "Severity" },
{ fieldName: "status", fieldLabel: "Status" },
]
[
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "createdDate", fieldLabel: "Creation Date", displayLabel: "C Date" },
{ fieldName: "owner", fieldLabel: "Owner" },
{ fieldName: "status", fieldLabel: "Status" },
]
用例2:
const oldMeta = [
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "city", fieldLabel: "City" },
{ fieldName: "createdDate", fieldLabel: "Created Date", displayLabel: "C Date" },
{ fieldName: "ownerName", fieldLabel: "Owner" },
{ fieldName: "severity", fieldLabel: "Severity" },
{ fieldName: "status", fieldLabel: "Status" },
];
const newMeta = [
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location" },
{ fieldName: "createdDate", fieldLabel: "Creation Date" },
{ fieldName: "owner", fieldLabel: "Owner" },
{ fieldName: "status", fieldLabel: "Status" },
];
我希望输出为:
[
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "city", fieldLabel: "City" },
{ fieldName: "createdDate", fieldLabel: "Creation Date", displayLabel: "C Date" },
{ fieldName: "ownerName", fieldLabel: "Owner" },
{ fieldName: "severity", fieldLabel: "Severity" },
{ fieldName: "status", fieldLabel: "Status" },
]
[
{ fieldName: "item", fieldLabel: "Item" },
{ fieldName: "location", fieldLabel: "Location", displayLabel: "Place" },
{ fieldName: "createdDate", fieldLabel: "Creation Date", displayLabel: "C Date" },
{ fieldName: "owner", fieldLabel: "Owner" },
{ fieldName: "status", fieldLabel: "Status" },
]
需要考虑以下几点:
- 如果
包含old
中没有的fieldName
,则它们不应出现在结果输出中new
- 如果
包含新的new
s,它们应该出现在结果输出中fieldName
- 如果
包含属性更改,则生成的输出应同时包含更改的属性和现有属性new
const fillObject=(from,to)=>{
for(从中输入变量){
if(来自.hasOwnProperty(键)){
if(Object.prototype.toString.call(从[key])=='[Object Object]'){
如果(!to.hasOwnProperty(键)){
到[键]={};
}
fillObject(从[key],到[key]);
}
如果(!to.hasOwnProperty(键)){
到[键]=从[键];
}
}
}
}
//用例1
常量oldMeta1=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”,displayLabel:“地点”},
{fieldName:“createdDate”,fieldLabel:“Created Date”,displayLabel:“C Date”},
{fieldName:“所有者”,fieldLabel:“所有者”},
{fieldName:“状态”,fieldLabel:“状态”},
];
常量newMeta1=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”},
{fieldName:“城市”,fieldLabel:“城市”},
{fieldName:“createdDate”,fieldLabel:“创建日期”},
{fieldName:“所有者名称”,fieldLabel:“所有者”},
{fieldName:“严重性”,fieldLabel:“严重性”},
{fieldName:“状态”,fieldLabel:“状态”},
];
让finalMeta1=[…newMeta1];
finalMeta1.forEach((新元数据)=>{
const oldmetada=oldMeta1.find((oldmetada)=>newMetaData.fieldName==oldmetada.fieldName);
如果(旧元数据){
fillObject(旧元数据、新元数据)
}
});
控制台日志(finalMeta1);
//用例2
常量oldMeta2=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”,displayLabel:“地点”},
{fieldName:“城市”,fieldLabel:“城市”},
{fieldName:“createdDate”,fieldLabel:“Created Date”,displayLabel:“C Date”},
{fieldName:“所有者名称”,fieldLabel:“所有者”},
{fieldName:“严重性”,fieldLabel:“严重性”},
{fieldName:“状态”,fieldLabel:“状态”},
];
常数newMeta2=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”},
{fieldName:“createdDate”,fieldLabel:“创建日期”},
{fieldName:“所有者”,fieldLabel:“所有者”},
{fieldName:“状态”,fieldLabel:“状态”},
];
让finalMeta2=[…newMeta2];
finalMeta2.forEach((新元数据)=>{
const oldmetada=oldMeta2.find((oldmetada)=>newMetaData.fieldName==oldmetada.fieldName);
如果(旧元数据){
fillObject(旧元数据、新元数据)
}
});
控制台日志(finalMeta2)代码>使用Lodash可以提高可读性和性能:
//用例1
常量oldMeta1=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”,displayLabel:“地点”},
{fieldName:“createdDate”,fieldLabel:“Created Date”,displayLabel:“C Date”},
{fieldName:“所有者”,fieldLabel:“所有者”},
{fieldName:“状态”,fieldLabel:“状态”},
];
常量newMeta1=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”},
{fieldName:“城市”,fieldLabel:“城市”},
{fieldName:“createdDate”,fieldLabel:“创建日期”},
{fieldName:“所有者名称”,fieldLabel:“所有者”},
{fieldName:“严重性”,fieldLabel:“严重性”},
{fieldName:“状态”,fieldLabel:“状态”},
];
//用例2
常量oldMeta2=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”,displayLabel:“地点”},
{fieldName:“城市”,fieldLabel:“城市”},
{fieldName:“createdDate”,fieldLabel:“Created Date”,displayLabel:“C Date”},
{fieldName:“所有者名称”,fieldLabel:“所有者”},
{fieldName:“严重性”,fieldLabel:“严重性”},
{fieldName:“状态”,fieldLabel:“状态”},
];
常数newMeta2=[
{fieldName:“项”,fieldLabel:“项”},
{fieldName:“位置”,fieldLabel:“位置”},
{fieldName:“createdDate”,fieldLabel:“创建日期”},
{fieldName:“所有者”,fieldLabel:“所有者”},
{fieldName:“状态”,fieldLabel:“状态”},
];
函数合并(oldMeta、newMeta){
const oldMetaMap=u.keyBy(oldMeta,el=>el.fieldName);
返回newMeta.map(el=>{
if(oldMetaMap中的el.fieldName){
返回{…..cloneDeep(oldMetaMap[el.fieldName]),…...cloneDeep(el)};
}
返回cloneDeep(el);
});
}
log(合并(oldMeta1,newMeta1));
log(合并(oldMeta2,newMeta2))代码>
“不要问……你还没有试图找到答案的问题(展示你的作品!)”@jabaa我不知道该怎么做,因此我在问。“问一个关于堆栈溢出的问题应该是找到答案的过程中的最后一步”请展示你的作品。到目前为止你试过什么?展示你的方法。描述它们为什么不起作用。@jabaa添加了我到目前为止一直在尝试的一部分内容。你的代码有什么问题吗?看起来它已经开始在Anks@jabba工作了。这确实提高了可读性,也减少了实现我想要做的事情所需的步骤。