【问题标题】: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() 之间的区别。

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

我该怎么办?

【问题讨论】:

    标签: javascript


    【解决方案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);

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

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

          【讨论】:

            猜你喜欢
            • 2018-10-16
            • 2020-02-14
            • 1970-01-01
            • 1970-01-01
            • 2015-03-30
            • 2015-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多