2015-12-18 1 views
3

Я пытаюсь прочитать массив объектов (это время начала/окончания) и объединить два (или более) тех времен, если они вернутся назад.Loop and Combine Time Ranges в массиве

ie. время окончания первого объекта совпадает с временем начала следующего объекта. Если они есть, соедините их. Затем проверьте вновь объединенные объекты конец времени со следующим объектом в массиве

Вот упрощенный массив раз:

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

Я хотел бы, что (или есть дифф массив) для вывода, как показано ниже :

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 
      }, 
      ] 

оригинальный массив времен всегда будет отсортирован от старейшего (наималейшего времени начала) до новейшего (наибольшего времени старта). Выход не должен быть в каком-либо конкретном порядке. Все объекты времени будут моментом.

Может кто-нибудь помочь мне решить эту проблему?

ответ

3

Это код, который я придумал

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