Javascript 从数组中的时间间隔计算唯一时间

Javascript 从数组中的时间间隔计算唯一时间,javascript,arrays,algorithm,logic,Javascript,Arrays,Algorithm,Logic,我需要计算用户播放视频的唯一秒数。我得到一个数组playbackArray,其中我得到了用户开始播放视频的位置(beginPosition)和用户停止播放视频的位置(endPosition) 我有这样一个数组: let playbackArray = [ { beginPosition: 0, endPosition: 30, // endPosition - beginPosition = 30 b

我需要计算用户播放视频的唯一秒数。我得到一个数组playbackArray,其中我得到了用户开始播放视频的位置(beginPosition)和用户停止播放视频的位置(endPosition)

我有这样一个数组:

    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进行比较

  • 如果没有重叠,请在另一个数组中添加此差异
  • 如果存在重叠,则将当前块的beginPosition与之前所有块的beginPosition进行比较,并尝试将差异扣除到该数组中
  • 真棒的挑战

    我将在时间跨度之间迭代,并确定它被视为重复的时间。为此,我考虑了下一个可能的案例

  • 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”)真棒的挑战

    我将在时间跨度之间迭代,并确定它被视为重复的时间。为此,我考虑了下一个可能的案例

  • 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没有按顺序排序,那么它就失败了。