我有一个对象数组,它们具有重复的resource_names
[
{'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"]}
]
它已按resource_name合并了重复的对象,并合并了工作日,而没有更改长度并保持它们在数组中的位置。合并时,应采用不为空的工作日。没有对象可以有重叠的工作日,所以这不是问题。
我将如何处理?我尝试遍历对象数组,但是我所做的是遍历数组中的每个元素,看看它们是否重复。这仅在元素重复一次时有效,而在有3个或更多具有相同resource_name的对象时无效。
答案 0 :(得分:3)
const resource = [
{ '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] }
];
const resObj = {};
resource.forEach((el)=>{
if(resObj[el.resource_name]){
el.weekdays.forEach((day,index)=>{
if(day){
resObj[el.resource_name].weekdays[index]=day;
}
});
}else{
resObj[el.resource_name] = el;
}
})
console.log(Object.keys(resObj).map(el=>resObj[el]))
答案 1 :(得分:1)
您可以找到对象并映射真实值。
var data = [{ 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] }],
result = data.reduce((r, { resource_name, weekdays }) => {
var temp = r.find((o) => resource_name === o.resource_name);
if (!temp) {
r.push(temp = { resource_name, weekdays: [] });
}
temp.weekdays = weekdays.map((v, i) => temp.weekdays[i] || v);
return r;
}, []);
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }