【问题标题】:Loop and Combine Time Ranges in an Array在数组中循环和组合时间范围
【发布时间】:2016-03-24 19:40:08
【问题描述】:

我正在尝试读取一组对象(即开始/结束时间),如果它们是背靠背的,则将其中的两个(或更多)时间组合起来。

即。第一个对象的结束时间与下一个对象的开始时间相同。如果是,请将它们组合起来。然后用数组中的下一个对象检查新组合对象的结束时间

这是一个简化的时间数组:

var times = [
             {
              start: 1, 
              end: 2
             },{
              start: 2, 
              end: 3
             },{
              start: 4, 
              end: 5
             },{
              start: 6, 
              end: 7
             },
            ]

我希望(或有一个 diff 数组)输出如下:

var newTimes = [
             {
              start: 1, 
              end: 3
             },{
              start: 4, 
              end: 5
             },{
              start: 6, 
              end: 7
             },
            ]

如果连续 3 次,那就更棘手了。

var threeTime = [
             {
              start: 1, 
              end: 2
             },{
              start: 2, 
              end: 3
             },{
              start: 3, 
              end: 5
             },{
              start: 6, 
              end: 7
             },
            ]

上面应该变成:

var newThreeTimes = [
             {
              start: 1,  
              end: 5
             },{
              start: 6, 
              end: 7
             },
            ]

原始时间数组将始终从最旧(最小开始时间)到最新(最大开始时间)排序。输出不需要按任何特定顺序。所有时间对象都是时刻。

谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript arrays momentjs


    【解决方案1】:

    这是我想出的代码

    function mergeArr(arr) {
    
        // Sort the array in descending order
        arr.sort(function(a, b) {
            return b.start - a.start;
        });
    
        // Traverse from the top as you will need to remove the elements
        // Merge the elements based on start of one and end of the previous
        for (var i = arr.length - 1; i > 0; i--) {
            if (arr[i].end == arr[i - 1].start) {
                arr[i].end = arr[i - 1].end;
                arr.splice(i - 1, 1);
            }
        }
    
        // Sort it again in reverse order.
        return arr.sort(function(a, b) {
            return a.start - b.start;
        });
    }
    

    评论使代码自我解释。

    Working Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多