如何计算条目列表之间的总时间?
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
数组有可能以“开始”条目结束,在这种情况下,time
和 Date.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】:首先检查数组是否以起始条目结尾并计算time
和new 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 所花费的总时间?