如何计算条目列表之间的总时间?

Posted

技术标签:

【中文标题】如何计算条目列表之间的总时间?【英文标题】:How to calculate total time between a list of entries? 【发布时间】:2017-06-06 06:39:33 【问题描述】:

我有一个这样的对象数组,其中action 始终是“开始”或“停止”,time 是 UNIX 毫秒时间戳(此处简化)。

[
  
    action: "start",
    time: 100,
  ,
  
    action: "stop",
    time: 150
  ,
  
    action: "start",
    time: 250
  ,
  
    action: "stop",
    time: 350
  
]

我需要找出每个“开始”和“停止”之间经过的总时间。在这种情况下,正确答案是150,因为

(150 - 100) + (350 - 250) = 150

数组有可能以“开始”条目结束,在这种情况下,timeDate.now() 之间的区别。

但已确保数组按时间排序,并且“开始”和“停止”条目必须正确交替。

我该怎么办?

【问题讨论】:

【参考方案1】:

我不熟悉 javascript

那个时间和 new Date().now() 之间的差异。

<html>
    <head>
        <script language="JavaScript">
	    function getTimeDifference() 
                var timeArray = [
		                    
				        action: "start",
					time: 100,
				    ,
				    
					action: "stop",
					time: 150
				    ,
				    
					action: "start",
					time: 250
				    ,
				    
					action: "stop",
					time: 350
				    ,
				    
					action: "start",
					time: 100,
				    
				];
	        var size = timeArray.length;
	        var timeDiff = 0;
		if(timeArray[size-1].action == 'start') 
		    // timeDiff = this.time - new Date().now();
		
		else 
		    var startTime = 0;
		    var endTime = 0;				
		    for(var i=0; i<size; i++) 								
			if(timeArray[i].action == 'start')
			    startTime = startTime + timeArray[i].time;
			else if(timeArray[i].action == 'stop')
			    endTime = endTime + timeArray[i].time;					
		    
		    timeDiff = endTime - startTime;
		
		alert(timeDiff);
	    
	</script>
    </head>
    <body>
	<input type="button" onclick="getTimeDifference()"/>
    </body>
</html>

正如您在以 action 作为 start 结尾的数组条件中看到的那样,我没有进行计算,因为我不确定过程。

【讨论】:

【参考方案2】:

首先检查数组是否以起始条目结尾并计算timenew Date().now() 之间的差异 在这种情况下,删除最后一个条目。之后,只需使用上一个答案中的 reduce 代码。

【讨论】:

【参考方案3】:

您可以检查项目,如果开始,则减去该值,否则添加该值。

Array#reduce的初始值,可以检查最后一个元素,以实际epoc时间为起始值,否则0

var data = [ action: "start", time: 100 ,  action: "stop", time: 150 ,  action: "start", time: 250 ,  action: "stop", time: 350 ,  action: "start", time: 400 ],
    end = 450, // should be Date.now(),
    sum = data.reduce(function (r, a) 
        return r + (a.action === 'start' ? -a.time : a.time);
    , data[data.length - 1].action === 'start' ? end : 0);

console.log(sum);

【讨论】:

【参考方案4】:

其实并没有你想的那么复杂。您基本上可以在每个组上应用加法(在您的情况下开始和停止),然后从 totalStop 中减去 totalStart。对于您提到的“附加开始”情况,您可以添加一个额外的条件。

var data = [action: "start",time: 100,, action: "stop",time: 150, action: "start",time: 250, action: "stop",time: 350, action: "start",time: 375, ];
totalStart = 0;
totalStop = 0;
isComplete = true;

data.forEach(function(el) 
    if (el.action == "start") 
        isComplete = false;
        totalStart += el.time;
     else if (el.action == "stop") 
        isComplete = true;
        totalStop += el.time;
    
);

if (!isComplete) 
    totalStop += 400; //  Date().now() in your case


alert(totalStop - totalStart);

还有很多替代方法可以做到这一点。

    您可以使用内置的“减少”功能。 您可以一次将数组作为两个项目进行迭代。 for(i=0;i

【讨论】:

以上是关于如何计算条目列表之间的总时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?

如何计算多个 android webview 所花费的总时间?

我将如何编码,以便计算机知道两个名称条目和三个名称条目之间的区别?

如何计算表中的条目?

列表中纬度/经度之间的最长距离

如何使用其他列表中的数据创建计算列