Javascript 计算对象中属性的总持续时间

Javascript 计算对象中属性的总持续时间,javascript,angularjs,reduce,pure-function,Javascript,Angularjs,Reduce,Pure Function,我在数组[0]中有以下对象: var arr[0]= [ { "startTime": "1300", "endTime": "1700", "eventName": "Sleep", "end_datetime": "20180510M0100", "start_datetime": "20180509M2300", }, { "startTime": "0800", "endTime": "1200", "even

我在数组[0]中有以下对象:

var arr[0]=
[
 {
   "startTime": "1300",
    "endTime": "1700",
    "eventName": "Sleep",
     "end_datetime": "20180510M0100", 
     "start_datetime": "20180509M2300", 
 },
 {
    "startTime": "0800",
    "endTime": "1200", 
    "eventName": "Breakfast",
     "end_datetime": "20180507M1200", 
     "start_datetime": "20180507M0800", 
 },
 {
   "startTime": "1300",
    "endTime": "1400",
    "eventName": "Lesson",
    "end_datetime": "20180507M1400", 
     "start_datetime": "20180507M1300", 
 },
 {
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Ski",
    "end_datetime": "20180511M170000", 
    "start_datetime": "20180511M130000",
 } 
]
end_数据时间的格式为YYYYMMDDMHMMSS(前4位是年,后面是月、日、分隔符“M”、小时、分钟和秒)


我想计算所有活动的总持续时间?(总共11小时,即睡眠2小时+早餐4小时+第一课1小时+滑雪4小时)

您需要一个累加器来记录到目前为止的时间。我假设这些数字指的是分钟或其他什么。如果它实际上是时间(如1700=下午5点),那么您显然需要做更多的逻辑工作(因为事件可能在1159开始,在0100结束,在这种情况下,startTime-endTime将不起作用),但从您的尝试来看,您似乎只是在寻找这两个数字之间的差异。下面是我得到的:

arr = [
{
   "startTime": "1300",
    "endTime": "1700",
    "eventName": "Tea" 
 },
 {
    "startTime": "0800",
    "endTime": "1200", 
    "eventName": "Breakfast" 
 },
 {
   "startTime": "1300",
    "endTime": "1400",
    "eventName": "Lesson" 
 },
 {
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Ski"
 } 
]

arr.reduce((acc, val) => {
  return acc + (parseInt(val.endTime) - parseInt(val.startTime))
}, 0)

// returns 1300

考虑到跨越多天的时间,这里有一个可能的实现:

const输入=[{
“开始时间”:“1300”,
“结束时间”:“1700”,
“eventName”:“睡眠”,
“结束日期时间”:“20180510M0100”,
“开始日期时间”:“20180509M2300”,
},
{
“开始时间”:“0800”,
“结束时间”:“1200”,
“事件名称”:“早餐”,
“结束日期时间”:“20180507M1200”,
“开始日期时间”:“20180507M0800”,
},
{
“开始时间”:“1300”,
“结束时间”:“1400”,
“事件名称”:“课程”,
“结束日期时间”:“20180507M1400”,
“开始日期时间”:“20180507M1300”,
},
{
“开始时间”:“1300”,
“结束时间”:“1700”,
“eventName”:“Ski”,
“结束日期时间”:“20180511M70000”,
“开始日期时间”:“20180511M30000”,
}
];
函数getDiff(datestr1、datestr2){
常数m1=力矩(日期str1,'YYYYMMDD*hhmm');
常数m2=力矩(日期t2,'yyyyymmdd*hhmm');
常数分钟差=m2.diff(m1,‘分钟’);
返回分钟差异;
}
const totalMinutes=input.reduce(
(累计{
结束日期时间,
开始日期时间
})=>accum+getDiff(开始日期时间、结束日期时间),
0
);
const totalHours=totalMinutes/60;
log(totalMinutes+“minutes=”+totalHours+“hours”);

因此,您需要所有活动的总开始时间和结束时间(例如1700-800?我想输出所有活动花费的总时间。(在本例中,总共11小时,即睡眠2小时+早餐4小时+课程1小时+滑雪4小时)Hi数字指的是hhmm(前2位为小时,后2位为分钟)。如何获取总时差。我可以在reduce函数中使用momentJS diff吗?当然可以。您可以使用任何日期/时间库或内置日期对象来进行更复杂的时差计算。这实际上取决于您的时间的复杂程度。好的。抱歉,我只是根据事件修改了问题可能在11点开始,第二天1点结束。