0

I have e.g. an array like this:

var myArray = [];

var item1 = {
    start: '08:00',
    end: '09:30'
}
var item2 = {
    start: '10:00',
    end: '11:30'
}
var item3 = {
    start: '12:00',
    end: '14:30'
}
var item4 = {
    start: '16:00',
    end: '18:25'
}
var item5 = {
    start: '19:00',
    end: '21:25'
}

myArray.push(item1);
myArray.push(item2);
myArray.push(item3);
myArray.push(item4);

After sorting the order should look like this

[item1, item2, item5, item4, item3]

So the items with start- time before 12:00 should be ascending and the items with start time after or equal 12:00 sould be in reverse order.

I use AngularJS to iterate over the items:

<div ng-repeat="item in $scope.myArray" | orderBy:myOrderFunction? ...

and I would need the above order for ng-repeat. Is there a possibiliy to do this (in a performant way)?

2 Answers 2

1

That's quite weird, to be honest. However, this should do it:

function wiggleTime(time) {
  var t = 60 * parseInt(time.substr(0, 2), 10) + parseInt(time.substr(3), 10);
  return (t >= 720) ? 2160 - t : t;
}

function wiggleComparator(a, b) {
  var aa = wiggleTime(a.start);
  var bb = wiggleTime(b.start);
  return aa - bb;
};
console.log(myArray.sort(wiggleComparator).map(function(o) { return o.start; }));
// ["08:00", "10:00", "19:00", "16:00", "12:00"]

To make it more performant, you could pre-wiggle the time and store it into the structure, so you wiggle it only once per element rather than twice per each tested pair.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks a lot!! Do you also know how to use it with angularJS's ng-repeat? Thanks!
Sorry, not an Angular person myself. However, getting wiggleComparator function to act as a custom comparator should work (with possibly some minor adjustments).
0

I have add a sort function in your code

myArray.sort(function(a, b) {
if(a.start.split(':')[0]>=12)
return a.start.split(':')[0] + b.start.split(':')[0];
else
return a.start.split(':')[0] - b.start.split(':')[0]
});

      <div ng-app>
        <div ng-controller="TodoCtrl">
        <div ng-repeat="item in myArray" >
           {{item.start}}
        </div>
        </div>
      </div>

 function TodoCtrl($scope) {
    var myArray = [];

   var item1 = {
     start: '08:00',
     end: '09:30'
    }
   var item2 = {
       start: '10:00',
       end: '11:30'
   }
   var item3 = {
       start: '12:00',
       end: '14:30'
   }
   var item4 = {
       start: '16:00',
       end: '18:25'
   }
   var item5 = {
       start: '19:00',
       end: '21:25'       
   }

   myArray.push(item1);
   myArray.push(item2);
   myArray.push(item3);
   myArray.push(item4);
   myArray.push(item5);
   myArray.sort(function(a, b) {
    if(a.start.split(':')[0]>=12)
      return a.start.split(':')[0] + b.start.split(':')[0];
    else
     return a.start.split(':')[0] - b.start.split(':')[0]
  });
   $scope.myArray=myArray;
   }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.