Warm tip: This article is reproduced from serverfault.com, please click

javascript-对一组对象进行分组并添加时间属性

(javascript - Group an array of objects and add the time attribute)

发布于 2020-11-28 10:23:42

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

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"},  
]

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

Questioner
egx
Viewed
0
Majed Badawi 2020-11-28 19:06:01

你可以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>