11

I'm making a phonegap app on iOS that requires sort a list by time I tried add the time to the id of each li item and then sort based on the id

<ul id="test">
<li id="4112">blub</li>
<li id="1422">blaaah</li>
<li id="6640">hmmmm</li>
<li id="2221">one more</li>
</ul>

and here is the javascript:

$(function(){
var elems = $('#test').children('li').remove();
elems.sort(function(a,b){
    return (new Date(a.id) > new Date(b.id));
});
$('#test').append(elems);
});

http://jsfiddle.net/3uYUq/1103/

I tried on chrome and it ran well . However, if I tried on phonegap app, the list is not sorted correctly . It doesn't follow any order. Any solution for this ? P/s: Someone said that on Safari it should be (new Date(a.id) - new Date(b.id)) on Safari but seems that it doesn't affect phonegap

Explain more about my phonegap code . This code retrive records from db and show it as list of items on html.

function getAllDeadlines_success(tx, results){

var len = results.rows.length;
//var s = "";
$('#allList').empty();
var tmpDueDate = '1900-01-01';
var tmpDueTime = '00:00';
for (var i=0; i<len; i++){
    var allDeadline = results.rows.item(i);

    var deadlineDatePart = allDeadline.duedate.split('-');
    var deadlineTimePart = allDeadline.duetime.split(':');

    var newDate = new Date(deadlineDatePart[0], deadlineDatePart[1] - 1 , deadlineDatePart[2], deadlineTimePart[0], deadlineTimePart[1], 0, 0);         
    var notiDate = new Date(newDate - 86400*1000);
    //compare with current time
    var result = isLate(allDeadline.duedate, allDeadline.duetime).toString();
    if ( result == "true"){         
        $('#allList').append('<li id = "'+allDeadline.duedate+' '+allDeadline.duetime+'"><a href="#DeadlineDetail" id = "'+allDeadline.id+'" data-transition = "slide">'+ allDeadline.class +'<br>'+ allDeadline.duedate+'  '+ allDeadline.duetime+'<br>'+ allDeadline.description +'</a></li>');
        // window.plugin.notification.local.add({
        //  id : getRandomInt(0,99999), 
        //     message: 'Dont forget to complete: '+allDeadline.description+'',
        //     badge: 0,
        //     date: notiDate
        // });
    }
}

$(function(){
    var elems = $('#allList').children('li').remove();
    elems.sort(function(a,b){

        return (new Date(a.id) > new Date(b.id));
    });

    $('#allList').append(elems);
});
$("#allList").listview().listview('refresh');

}
ThangPQ
  • 111
  • 1
  • 1
  • 6
  • The comparison function must return an integer. Your comparison function returns `true` or `false`. – Barmar May 14 '14 at 17:28
  • Why are you converting IDs to `Date`? – Barmar May 14 '14 at 17:28
  • I converted to date because I want to check if the date of the item a is later or before the date of the item b so I can order them correctly – ThangPQ May 14 '14 at 19:41
  • The IDs are small numbers like 4112 and 6640 -- what kinds of dates are those? – Barmar May 14 '14 at 20:17
  • Because the content of the list contain a lot of information, include the date. But I don't know how to retrieve only the date inside the content so I use this trick to add the date into the ID so I can get the date value from ID and sort them – ThangPQ May 15 '14 at 10:05
  • You can use `.text()` to get the contents of the LI, and use a regular expression to extract the date from this. Or you can put the date into a `data-date="2014-05-10"` attribute, then use `$(this).data("date")` to get it. – Barmar May 15 '14 at 16:35

1 Answers1

31

The comparison function must return an integer. sort checks whether it's negative, zero, or positive, and uses that to determine how the two elements should be ordered. So do:

elems.sort(function(a, b) {
    return a.id - b.id;
});

Or, in modern ES6 style:

elems.sort((a, b) => a.id - b.id);
Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Barmar
  • 741,623
  • 53
  • 500
  • 612