12

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');

}
6
  • The comparison function must return an integer. Your comparison function returns true or false. Commented May 14, 2014 at 17:28
  • Why are you converting IDs to Date? Commented May 14, 2014 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 Commented May 14, 2014 at 19:41
  • The IDs are small numbers like 4112 and 6640 -- what kinds of dates are those? Commented May 14, 2014 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 Commented May 15, 2014 at 10:05

1 Answer 1

33

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);
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.