Javascript数组合并具有相同键值的对象

时间:2020-10-21 11:08:31

标签: javascript arrays

假设我有一个包含如下内容的数组...

arr = [ {date:'2020-10-21', time_start:'8:00', time_end:'9:00'}, 
        {date:'2020-10-22', time_start:'12:00', time_end:'1:00'},
        {date:'2020-10-21', time_start:'10:00', time_end:'11:00'} ]

我如何合并它,使其看起来像这样...

new_arr = [ { 
                date:'2020-10-21', 
                time_start:[ '8:00', '10:00' ], 
                time_end:[ '9:00', '11:00' ] 
            },
            { 
                date:'2020-10-22', time_start: '12:00', time_end: '1:00'  
            } 
          ]

3 个答案:

答案 0 :(得分:1)

如果您需要对事物进行分组,最简单的方法是使用.reduce

let arr = [ {date:'2020-10-21', time_start:'8:00', time_end:'9:00'}, 
        {date:'2020-10-22', time_start:'12:00', time_end:'1:00'},
        {date:'2020-10-21', time_start:'10:00', time_end:'11:00'} ]
        
let grouped = arr.reduce((a, { date, time_start, time_end }) => {
   let item = a.find(el => el.date === date);
   if(!item) return [...a, {date, time_start: [time_start], time_end: [time_end] }];
   item.time_start.push(time_start)
   item.time_end.push(time_end);
   return a;
},[])

console.log(grouped);

答案 1 :(得分:0)

您可以使用数组reduce和Object.values。使用reduce以累加器对象开头,并按日期检查对象是否具有密钥。如果没有,则在对象中创建该键。

const arr = [{
    date: "2020-10-21",
    time_start: "8:00",
    time_end: "9:00"
  },
  {
    date: "2020-10-22",
    time_start: "12:00",
    time_end: "1:00"
  },
  {
    date: "2020-10-21",
    time_start: "10:00",
    time_end: "11:00"
  }
];

const dt = arr.reduce((acc, curr) => {
  if (!acc[curr.date]) {
    acc[curr.date] = {
      date: curr.date,
      time_start: curr.time_start,
      time_end: curr.time_end
    };
  } else {
    if (Array.isArray(acc[curr.date].time_start)) {
      acc[curr.date].time_start.push(curr.date);
    } else {
      acc[curr.date].time_start = [acc[curr.date].time_start, curr.date];
    }

    if (Array.isArray(acc[curr.date].time_end)) {
      acc[curr.date].time_end.push(curr.date);
    } else {
      acc[curr.date].time_end = [acc[curr.date].time_end, curr.date];
    }
  }

  return acc;
}, {}); // accumulator object
console.log(Object.values(dt))
new_arr = [ { date:'2020-10-21', time_start:[ '8:00', '10:00' ], time_end:[ '9:00', '11:00' ] }, { date:'2020-10-22', time_start: '12:00', time_end: '1:00' } ]

答案 2 :(得分:-1)

您可以简单地使用它来减少密钥重复...看起来像您想要的...

// to keep the first obj duplicate
function uniqByKeepFirst(a, key) {
    let seen = new Set();
    return a.filter(item => {
        let k = key(item);
        return seen.has(k) ? false : seen.add(k);
    });
}
// to keep the last obj duplicate
function uniqByKeepLast(a, key) { // edit: adding method to keep last
    return [
        ...new Map(
            a.map(x => [key(x), x])
        ).values()
    ]
}

let arr = [{
        date: '2020-10-21',
        time_start: '8:00',
        time_end: '9:00'
    },
    {
        date: '2020-10-22',
        time_start: '12:00',
        time_end: '1:00'
    },
    {
        date: '2020-10-21',
        time_start: '10:00',
        time_end: '11:00'
    }
]


console.log(uniqByKeepFirst(arr, obj => obj.date));
console.log(uniqByKeepLast(arr, obj => obj.date));