Varun Sreedharan
Varun Sreedharan

Reputation: 577

Grouping first and last value in array (Consecutive values are group with first and last element)

I have one object array with time intervals , Number 0 indicates sunday . In my time scheduling page selecting different time ranges in a particular day . I want to group the time values . My initial array is given below

time schedule selection looks like

enter image description here

Each cell has data-day and data-time attribute and selected cell with data-selected attribute

i am iterate through the selected time and got the result like

var selectedIntervals = {};

$('td[data-selected]').each(function() {
  var a = $(this).attr('data-day');
  var b = $(this).attr('data-time');

  if(!selectedIntervals[a]) {
       selectedIntervals[a]=[];
  }
  selectedIntervals[a].push(b);
});

enter image description here

I want the output like

{
         0: [["00:00", "05:00"],["08:00", "11:00"]]

}

Please help .

Upvotes: 0

Views: 373

Answers (4)

four
four

Reputation: 564

Combining your initial code with elfan's code You get this:

$(function() {

    var list = {};
    
    var day = 0;
    list[day] = selectedSchedules(day);
    day = 1;
    list[day] = selectedSchedules(day);
    
    console.log(list);

    function selectedSchedules(day) {
        var schedules = [];
        var interval, hour;
        $('td[data-selected][data-day=' + day + ']').each(function() {
            var b = $(this).data('time');
            var current = parseInt(b);
            if (!interval || (current != parseInt(interval[1]) + 1)) {
                interval = [b, b];
                schedules.push(interval);
            } else {
                interval[1] = b;
            }
        });
        
        return schedules;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
    <tbody>
        <tr>
            <td data-day="0" data-time="00:00" data-selected="true">00:00</td>
            <td data-day="1" data-time="00:00" data-selected="true">00:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="01:00" data-selected="true">01:00</td>
            <td data-day="1" data-time="01:00" data-selected="true">01:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="02:00" data-selected="true">02:00</td>
            <td data-day="1" data-time="02:00" data-selected="true">02:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="03:00" data-selected="true">03:00</td>
            <td data-day="1" data-time="03:00" data-selected="true">03:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="04:00" data-selected="true">04:00</td>
            <td data-day="1" data-time="04:00" data-selected="true">04:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="05:00" data-selected="true">05:00</td>
            <td data-day="1" data-time="05:00" data-selected="true">05:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="06:00">06:00</td>
            <td data-day="1" data-time="06:00">06:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="07:00">07:00</td>
            <td data-day="1" data-time="07:00">07:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="08:00" data-selected="true">08:00</td>
            <td data-day="1" data-time="08:00">08:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="09:00" data-selected="true">09:00</td>
            <td data-day="1" data-time="09:00" data-selected="true">09:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="10:00" data-selected="true">10:00</td>
            <td data-day="1" data-time="10:00" data-selected="true">10:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="11:00" data-selected="true">11:00</td>
            <td data-day="1" data-time="11:00" data-selected="true">11:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="12:00">12:00</td>
            <td data-day="1" data-time="12:00" data-selected="true">12:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="13:00">13:00</td>
            <td data-day="1" data-time="13:00">13:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="14:00">14:00</td>
            <td data-day="1" data-time="14:00">14:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="15:00">15:00</td>
            <td data-day="1" data-time="15:00">15:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="16:00">16:00</td>
            <td data-day="1" data-time="16:00">16:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="17:00">17:00</td>
             <td data-day="1" data-time="17:00">17:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="18:00">18:00</td>
            <td data-day="1" data-time="18:00">18:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="19:00">19:00</td>
            <td data-day="1" data-time="19:00">19:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="20:00">20:00</td>
            <td data-day="1" data-time="20:00" data-selected="true">20:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="21:00">21:00</td>
            <td data-day="1" data-time="21:00" data-selected="true">21:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="22:00">22:00</td>
            <td data-day="1" data-time="22:00" data-selected="true">22:00</td>
        </tr>
        <tr>
            <td data-day="0" data-time="23:00">23:00</td>
            <td data-day="1" data-time="23:00" data-selected="true">23:00</td>
        </tr>

    </tbody>
</table>

Upvotes: 0

Chupo_cro
Chupo_cro

Reputation: 718

Try this:

arr = ["00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "08:00", "09:00", "10:00", "11:00"];
output = [];
start = arr[0];
for(i=1; i<arr.length; i++) {
    if(i == arr.length-1) {
        output.push([start, arr[i]]);   
        break;
    }
    if(parseInt(arr[i]) - parseInt(arr[i-1]) > 1) {
        output.push([start, arr[i-1]]);
        start = arr[i];
    }
}

Upvotes: 1

elfan
elfan

Reputation: 1131

Here is a function to make intervals from an array of hour strings.

  function makeInterval(arr) {
    //e.g. arr = ["00:00", "01:00", "02:00", "03:00", "06:00", "10:00", "11:00"]
    //returns [["00:00", "03:00"], ["06:00", "06:00"], ["10:00", "11:00"]]
    var interval, result = [];
    for (var i = 0; i < arr.length; i++) {
      var hour = parseInt(arr[i]);
      if (!interval || (hour != parseInt(interval[1]) + 1)) { //if first time or the hour jumps
        interval = [arr[i], arr[i]];  //create new interval
        result.push(interval);
      }
      else {
        interval[1] = arr[i]; //update the end of interval
      }
    }
    return result;
  }

you can call it like

  makeInterval(selectedIntervals[0]);

do a loop over the day number if necessary.

Upvotes: 1

wang sky
wang sky

Reputation: 141

mid = a.length
mid=parseInt(a.length / 2)
b=[[a[0],a[mid]],[a[mid+1],a[a.length-1]]]
console.info(b)

Upvotes: 0

Related Questions