我有一个像这样的对象数组,其中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"结束。条目,在这种情况下,差异将介于time
和Date.now()
之间。
然而,确保阵列按时间排序,并且" start"并且"停止"条目必须正确地交替。
我该如何解决这个问题?
答案 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);

还有很多替代方法可以做到这一点。
- 你可以使用内置"减少"功能。
- 您可以一次迭代数组作为两个项目。 for(i = 0; i< dataSize; i = i + 2)
醇>
答案 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;
正如你所看到的那样,以数组作为开始的数组结束,我还没有进行计算,因为我不确定程序。