JavaScript:仅将2个对象数组的差异/更改合并到新的对象数组中

JavaScript:仅将2个对象数组的差异/更改合并到新的对象数组中,javascript,Javascript,我需要一些帮助。如何将2个对象数组的差异/更改合并到新的对象数组中 用例1: const oldMeta = [ { fieldName: "item", fieldLabel: "Item" }, { fieldName: "location", fieldLabel: "Location", displayLabel: "Place" }, { fieldName: "

我需要一些帮助。如何将2个对象数组的差异/更改合并到新的对象数组中

用例1:

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
    包含新的
    fieldName
    s,它们应该出现在结果输出中
  • 如果
    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工作了。这确实提高了可读性,也减少了实现我想要做的事情所需的步骤。