将对象数组分组并添加时间属性

Group an array of objects and add the time attribute

我有一组自定义对象,其中填充了用户输入。该数组如下所示:

let array = [
  {Course: "Design", Hours: "01:00:00", Week: "1"}, 
  {Course: "Design", Hours: "01:00:00", Week: "3"}, 
  {Course: "Design", Hours: "01:00:00", Week: "2"}, 
  {Course: "Design", Hours: "01:00:00", Week: "1"}, 
  {Course: "Design", Hours: "01:00:00", Week: "2"}
]

我需要修改此数组,以便计算同一周的所有小时数,并根据周的顺序将值放入数组中。我想要的结果是这样的:

let newArray = [
  {Course: "Design", Hours: "02:00:00", Week: "1"}, 
  {Course: "Design", Hours: "02:00:00", Week: "2"},
  {Course: "Design", Hours: "01:00:00", Week: "3"},  
]

所以基本上我需要同时排序和计算总和。

您可以使用moment.js来获取时间字符串的总和。

要按周对项目进行分组,您可以使用 .reduce

最后,要按 Week 对项目进行排序,请使用 .sort:

let array = [
  {Course: "Design", Hours: "01:00:00", Week: "1"}, 
  {Course: "Design", Hours: "01:00:00", Week: "3"}, 
  {Course: "Design", Hours: "01:00:00", Week: "2"}, 
  {Course: "Design", Hours: "01:00:00", Week: "1"}, 
  {Course: "Design", Hours: "01:00:00", Week: "2"}
];

const addTwoTimeStrs = (a, b) => {
  let sum = moment.duration(a).add(moment.duration(b));
  sum = moment.utc(sum.asMilliseconds()).format("HH:mm:ss");
  return sum;
}

const arr = Object.values(
  array.reduce((acc,item) => {
    const { Hours: hours, Week: week } = item;
    const weekItem = acc[week];
    acc[week] = weekItem
      ? { ...weekItem, Hours: addTwoTimeStrs(weekItem.Hours,hours) }
      : item;
    return acc;
  }, {})
);

const res = arr.sort((a,b) => Number(a.Week) - Number(b.Week));

console.log(res.map(e => e.Hours));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>