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

时间:2019-01-09 14:14:50

标签: javascript arrays

我有一个对象数组,它们具有重复的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的对象时无效。

2 个答案:

答案 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; }

相关问题