Javascript 如何在数组中合并重复对象的属性

Javascript 如何在数组中合并重复对象的属性,javascript,arrays,Javascript,Arrays,我有一个具有重复资源名称的对象数组 [ {'resource_name': 'Objectname1', 'weekdays': [null, null, null, "vacation", "vacation"]}, {'resource_name': 'Objectname2', 'weekdays': [null, null, "vacation", "vacation", "vacation"]}, {'resource_name': 'Objectname1', 'wee

我有一个具有重复资源名称的对象数组

[ 
  {'resource_name': 'Objectname1', 'weekdays': [null, null, null, "vacation", "vacation"]},
  {'resource_name': 'Objectname2', 'weekdays': [null, null, "vacation", "vacation", "vacation"]},
  {'resource_name': 'Objectname1', 'weekdays': ["vacation", "vacation", null, null, null]},
  {'resource_name': 'Objectname1', 'weekdays': [null, null, "vacation", null, null]}  
]
我的目标是这样:

[ 
  {'resource_name': 'Objectname1', 'weekdays': ["vacation", "vacation", "vacation", "vacation", "vacation"]},
  {'resource_name': 'Objectname2', 'weekdays': [null, null, "vacation", "vacation", "vacation"]}
]
它按资源名称合并了重复的对象,并合并了工作日,而不更改长度并保持其在数组中的位置。合并时,应采用非空的工作日。任何对象都不能有重叠的工作日,因此这不是问题


我将如何处理这个问题?我尝试遍历我的对象数组,但我所做的是遍历数组中的每个元素,看看它们是否有重复项。这仅在元素复制一次时有效,但在有3个或更多具有相同资源名称的对象时无效。

您可以找到这些对象并仅映射真实值

var data=[{resource_name:'Objectname1',工作日:[null,null,null,“休假”,“休假”]},{resource_name:'Objectname2',工作日:[null,null,“休假”,“休假”]},{resource_name:'Objectname1',工作日:[“休假”,“休假”,null,null]},{resource_name:'Objectname1,工作日:[null,null,“假期”,null,null]}],
结果=数据.reduce((r,{resource_name,weekdays})=>{
var temp=r.find((o)=>resource\u name==o.resource\u name);
如果(!temp){
r、 推送(temp={resource_name,平日:[]});
}
临时工作日=工作日地图((v,i)=>临时工作日[i]| | v);
返回r;
}, []);
console.log(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以找到对象并映射onlöy truty值

var data=[{resource_name:'Objectname1',工作日:[null,null,null,“休假”,“休假”]},{resource_name:'Objectname2',工作日:[null,null,“休假”,“休假”]},{resource_name:'Objectname1',工作日:[“休假”,“休假”,null,null]},{resource_name:'Objectname1,工作日:[null,null,]假期“,空,空]}],
结果=数据.reduce((r,{resource_name,weekdays})=>{
var temp=r.find((o)=>资源\u name===o.resource\u name);
如果(!temp){
r、 推送(temp={resource_name,平日:[]});
}
临时工作日=工作日地图((v,i)=>临时工作日[i]| | v);
返回r;
}, []);
console.log(结果)
.as控制台包装{最大高度:100%!重要;顶部:0;}
const资源=[
{'resource_name':'Objectname1','weekdays':[null,null,null,“休假”,“休假”]},
{'resource_name':'Objectname2','weekdays':[null,null,“休假”,“休假”,“休假”]},
{'resource_name':'Objectname1','weekdays':[“休假”,“休假”,null,null,null]},
{'resource_name':'Objectname1','weekdays':[null,null,“休假”,null,null]}
];
const resObj={};
resource.forEach((el)=>{
if(资源[el.资源名称]){
el.平日.forEach((日,索引)=>{
如果(天){
resObj[el.resource_name]。工作日[索引]=天;
}
});   
}否则{
resObj[el.resource_name]=el;
}
})
console.log(Object.keys(resObj.map)(el=>resObj[el]))
const资源=[
{'resource_name':'Objectname1','weekdays':[null,null,null,“休假”,“休假”]},
{'resource_name':'Objectname2','weekdays':[null,null,“休假”,“休假”,“休假”]},
{'resource_name':'Objectname1','weekdays':[“休假”,“休假”,null,null,null]},
{'resource_name':'Objectname1','weekdays':[null,null,“休假”,null,null]}
];
const resObj={};
resource.forEach((el)=>{
if(资源[el.资源名称]){
el.平日.forEach((日,索引)=>{
如果(天){
resObj[el.resource_name]。工作日[索引]=天;
}
});   
}否则{
resObj[el.resource_name]=el;
}
})

log(Object.keys(resObj.map)(el=>resObj[el]))
如果它们具有相同的名称,并且两个数组在同一索引处都不为null,会发生什么?如果填充的值不匹配,会发生什么?@JoshAdams这之前会被检查,并且永远不会发生。我正在尝试扩展一个使用API的旧代码,该API已经检查过了。到目前为止,您尝试了什么?现在您正在要求陌生人执行100%的操作这项工作。@ChrisBarr我正在尝试使用不同的for循环遍历数组,以检查数组是否有重复的对象。()问题是我不知道如何正确合并对象并将它们添加回初始数组,而不中断索引并检查同一数组中是否有更多重复项,因为它可以有3个具有相同资源名称的不同对象。现在我正忙于理解我得到的这两个答案中的代码的实际含义,因为at语法很难理解。如果它们具有相同的名称,并且两个数组在同一索引处不为null,会发生什么?如果填充的值不匹配,会发生什么?@Josh Adams这以前被检查过,并且永远不会发生。我正在尝试扩展一个使用API的旧代码,该API已经检查过了。到目前为止,您尝试了什么?现在您是一个让陌生人完成100%的工作。@ChrisBarr我试图在数组中使用不同的for循环来检查数组是否有重复的对象。()问题是我不知道如何正确合并对象并将它们添加回初始数组,而不中断索引并检查同一数组中是否有更多重复项,因为它可以有3个具有相同资源名称的不同对象。现在我正忙于理解我得到的这两个答案中的代码的实际含义,因为至少语法很难理解。