JS for循环以获取每个数组中的日期差

问题描述 投票:1回答:1

我试图总结每个成员的缺勤天数。

我们只有两个成员:A和B。A出于不同的原因离开了两次,她放假3天,其他原因放假2天。B已住院8天,假期4天。

所以,这是我尽力而为的代码。

*例如,我写的日期。日期值将由JS onclick发布。 不需要toString或其他。

var member = [{
  name : "A",
  absent : [{
    reason : "Leave",
    start_date : "2020-02-01",
    end_date : "2020-02-03"
  },{
    reason : "etc",
    start_date : "2020-02-15",
    end_date : "2020-02-16"
  }
  ]
},{
  name : "B",
  absent : [{
    reason : "Hospitalized",
    start_date : "2020-02-03",
    end_date : "2020-02-10"
  },{
    reason : "Leave",
    start_date : "2020-02-10",
    end_date : "2020-02-13"
  }
  ]
}]

var countAbsentDays = function(){
  var countDays_start = member[0].absent[0].start_date;
  var countDays_end = member[0].absent[0].end_date;
  var diff = (new Date(countDays_end)) - (new Date(countDays_start));
  var count = diff/(1000 * 60 * 60 * 24);
  
  return count;
};

console.log(countabsentDays());

要收集每个成员的缺勤天数,我需要使用for循环开发以下代码。

 var countDays_start = member[0].absent[0].start_date;

猜想,我输入0的索引号可以用变量替换。但是我无法想象这个函数如何在absent数组及其元素absent.start_dateabsent.end_date上全部运行。

有人帮忙吗?

javascript arrays for-loop date-difference
1个回答
0
投票

您可以使用map转换数组,并减少以将数组元素累加为一个值。

    var member = [{
      name : "A",
      absent : [{
        reason : "Leave",
        start_date : "2020-02-01",
        end_date : "2020-02-03"
      },{
        reason : "etc",
        start_date : "2020-02-15",
        end_date : "2020-02-16"
      }
      ]
    },{
      name : "B",
      absent : [{
        reason : "Hospitalized",
        start_date : "2020-02-03",
        end_date : "2020-02-10"
      },{
        reason : "Leave",
        start_date : "2020-02-10",
        end_date : "2020-02-13"
      }
      ]
    }]

    var countAbsentDays = function(){
      return member.map( m => // map every element of member array to object { [m.name]: (reduced value of absent array) }
          ({
             [m.name]: 
                m.absent.reduce(
                    (acc, x) => 
                      acc + dateDiff(x.end_date, x.start_date)
                , 0 )  // accumulator + dateDiff result returned for every element
           })
      );
      function dateDiff(end, start) {
        var countDays_start = start;
        var countDays_end = end;
        var diff = (new Date(countDays_end)) - (new Date(countDays_start));
        var count = diff/(1000 * 60 * 60 * 24);

        return count;
      }
    };

    console.log(countAbsentDays());
© www.soinside.com 2019 - 2024. All rights reserved.