Javascript 从数组中的时间间隔计算唯一时间
我需要计算用户播放视频的唯一秒数。我得到一个数组playbackArray,其中我得到了用户开始播放视频的位置(beginPosition)和用户停止播放视频的位置(endPosition) 我有这样一个数组:Javascript 从数组中的时间间隔计算唯一时间,javascript,arrays,algorithm,logic,Javascript,Arrays,Algorithm,Logic,我需要计算用户播放视频的唯一秒数。我得到一个数组playbackArray,其中我得到了用户开始播放视频的位置(beginPosition)和用户停止播放视频的位置(endPosition) 我有这样一个数组: let playbackArray = [ { beginPosition: 0, endPosition: 30, // endPosition - beginPosition = 30 b
let playbackArray = [
{
beginPosition: 0,
endPosition: 30, // endPosition - beginPosition = 30
blockNum: 0
},
{
beginPosition: 45,
endPosition: 65, // endPosition - beginPosition = 20
blockNum: 1
},
{
beginPosition: 55,
endPosition: 85, // endPosition - beginPosition = 30
// but only 20 new seconds (65s - 85s) so total video playback is 30 + 20 + 20 = 70s.
blockNum: 2
}
]
基本上,如果数组中的块中存在重叠时间
必须删除这些重叠的时间间隔并仅计算
此阵列的唯一时间
我看到的一种方法是在这个数组上运行一个循环,遍历每个块,并将当前块的beginPosition和前一个块的endPosition进行比较
let playbackArray=[{
开始位置:0,
endPosition:30,//endPosition-beginPosition=30
blockNum:0
},
{
起始位置:45,
endPosition:65,//endPosition-beginPosition=20
blockNum:1
},
{
起始位置:55,
endPosition:85,//endPosition-beginPosition=30
//但是只有20秒(65秒-85秒),所以总的视频播放时间是30+20+20=70秒。
blockNum:2
}
]
让重复=0;
设时间=0;
对于(变量i=0;i回放数组[j].beginPosition){
//第i场比赛在第j场比赛开始后结束
if(播放阵列[i].endPosition>playbackArray[j].endPosition){
//第i场比赛在第j场比赛结束后结束
repeat+=playbackArray[j]。endPosition-playbackArray[i]。beginPosition;
}否则{
//第一局在第j局结束
repeat+=playbackArray[i]。endPosition-playbackArray[j]。beginPosition;
}
}
}
}
日志(“总时间:+时间”,重复时间:+重复);
var res=时间重复;
日志(“实时:+res”)代码>真棒的挑战
我将在时间跨度之间迭代,并确定它被视为重复的时间。为此,我考虑了下一个可能的案例
timeA在timeB内开始,timeB结束后timeA结束
timeA在timeB内部开始,timeA在timeB结束之前结束
timeA在timeB内部结束,timeA在timeB开始之前开始
timeA在timeB结束后结束
我希望这就是你想要的:)
let playbackArray=[{
开始位置:0,
endPosition:30,//endPosition-beginPosition=30
blockNum:0
},
{
起始位置:45,
endPosition:65,//endPosition-beginPosition=20
blockNum:1
},
{
起始位置:55,
endPosition:85,//endPosition-beginPosition=30
//但是只有20秒(65秒-85秒),所以总的视频播放时间是30+20+20=70秒。
blockNum:2
}
]
让重复=0;
设时间=0;
对于(变量i=0;i回放数组[j].beginPosition){
//第i场比赛在第j场比赛开始后结束
if(播放阵列[i].endPosition>playbackArray[j].endPosition){
//第i场比赛在第j场比赛结束后结束
repeat+=playbackArray[j]。endPosition-playbackArray[i]。beginPosition;
}否则{
//第一局在第j局结束
repeat+=playbackArray[i]。endPosition-playbackArray[j]。beginPosition;
}
}
}
}
日志(“总时间:+时间”,重复时间:+重复);
var res=时间重复;
日志(“实时:+res”)代码>如果间隔首先按其起始周期排序,那么我们可以根据以下三种情况将测试间隔(-[-]-
)添加到不断增长的间隔列表中:
// 1: Ignore current interval
----[--<--->--]----
----[---------]----
// 2: Merge top and current
----[--<---]-->----
----[---------]----
// 3: Add current to stack
----[---]---<-->---
----[---]---[--]---
如果间隔首先按其起始周期排序,那么我们可以根据以下三种情况将测试间隔(-[-]-
)添加到不断增长的间隔列表中:
// 1: Ignore current interval
----[--<--->--]----
----[---------]----
// 2: Merge top and current
----[--<---]-->----
----[---------]----
// 3: Add current to stack
----[---]---<-->---
----[---]---[--]---
到目前为止,您尝试了什么?如何选择生成的blockNum
s?@ScottSauyet,blockNums可以以任何方式选择。暴力方式是使用一组所有观看的秒数。无逻辑且保证唯一。:)@霍利利利夫斯:我想你误解了这个问题。到目前为止你尝试了什么?结果是blockNum
s应该如何选择?@ScottSauyet,blockNums可以以任何方式选择。蛮力的方法是使用一组所有观看的秒数。无逻辑且保证唯一。:)@我想你误解了这个问题。谢谢你的回答。这是一个简单而伟大的答案,但这个答案的唯一问题是,如果开始位置和结束位置没有按顺序排序,那么它就失败了。谢谢你的回答。这是一个更简单、更好的答案,但这个答案的唯一问题是,如果beginPosition和endPosition没有按顺序排序,那么它就失败了。