【问题标题】:Group an array of objects and add the time attribute [duplicate]对一组对象进行分组并添加时间属性[重复]
【发布时间】:2021-03-10 21:33:07
【问题描述】:

我有一个由用户输入填充的自定义对象数组。数组如下所示:

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

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

【问题讨论】:

    标签: javascript arrays sorting datetime reduce


    【解决方案1】:

    您可以使用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>

    【讨论】:

    • 谢谢。如果我只想要一个小时值的数组,需要做哪些更改?像这样:让小时 = [02:00:00, 02:00:00, 01:00:00]?
    • @egx 欢迎您。如果解决了问题,请点赞并将答案标记为解决方案。关于您的问题,您可以使用.map,如下所示:res.map(e => e.Hours)
    • 我会将其标记为已解决,但它似乎适用于地图。当我使用 console.log() res 时,我仍然得到一组对象。我只需要一个包含 Hours 值的数组。
    • @egx 答案已更新
    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 2021-11-09
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多