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

时间:2017-01-21 09:38:11

标签: javascript

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

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

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

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

阵列有可能以" start"结束。条目,在这种情况下,差异将介于timeDate.now()之间。

然而,确保阵列按时间排序,并且" start"并且"停止"条目必须正确地交替。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

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

对于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);




答案 1 :(得分:1)

实际上它并不像你想象的那么复杂。您基本上可以在每个组上添加添加(在您的情况下启动和停止),然后从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.   
  3. 您可以一次迭代数组作为两个项目。 for(i = 0; i< dataSize; i = i + 2)
  4.   

答案 2 :(得分:0)

首先检查数组是否以开始条目结束并计算char str1[] = "This is str1"; char str2[] = "This is str2"; time之间的差异。在这种情况下,删除最后一个条目。之后,只需使用上一个答案中的reduce代码。

答案 3 :(得分:0)

我不熟悉JavaScript

  

在该时间与新Date()之间存在差异。现在()。



void Save_Data(string temp)
{
    bool[] BoolArray = new bool[temp.Length];
    BitArray Barray = new BitArray(BoolArray.Length);
    char[] ch = temp.ToCharArray();

    for (int i = 0; i < temp.Length; i++)
    {
        if (ch[i] == '0')
        {
            Barray[i] = false;
        }
        else
        {
            Barray[i] = true;
        }
    }

    Stream stream = new FileStream("D:\\test.dat", FileMode.Create);
    StreamWriter sw = new StreamWriter(stream);

    foreach (bool bit in Barray)
    {
        sw.Write(bit ? 1 : 0);
    }

    sw.Flush();
    sw.Close();
}
&#13;
&#13;
&#13;

正如你所看到的那样,以数组作为开始的数组结束,我还没有进行计算,因为我不确定程序。