使用JavaScript按ID对列表进行排序

11

我正在iOS上制作一个Phonegap应用程序,需要按时间排序列表。 我尝试将时间添加到每个li项的id中,然后根据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>

这里是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/

我在谷歌浏览器上试过了,它可以正常运行。但是,如果我在phonegap应用上尝试,列表不会正确排序。它没有遵循任何顺序。有解决方案吗? P/s:有人说在Safari上应该是(new Date(a.id) - new Date(b.id)),但似乎对phonegap没有影响。

更多关于我的phonegap代码的解释。这段代码从数据库中检索记录,并在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');

}

比较函数必须返回一个整数。你的比较函数返回"true"或"false"。 - Barmar
你为什么要将ID转换为“日期”? - Barmar
我将其转换为日期,因为我想检查项目a的日期是在项目b的日期之后还是之前,以便我可以正确排序它们。 - ThangPQ
这些ID是像4112和6640这样的小数字 - 这些是什么类型的日期? - Barmar
因为列表的内容包含了很多信息,其中包括日期。但是我不知道如何仅提取内容中的日期,所以我使用这个技巧将日期添加到ID中,这样我就可以从ID中获取日期值并进行排序。 - ThangPQ
你可以使用.text()来获取LI的内容,并使用正则表达式从中提取日期。或者,您可以将日期放入data-date="2014-05-10"属性中,然后使用$(this).data("date")来获取它。 - Barmar
1个回答

31
比较函数必须返回一个整数。 sort 会检查它是否为负数、零或正数,并使用这个结果来决定这两个元素应该如何排序。因此,请这样做:
elems.sort(function(a, b) {
    return a.id - b.id;
});

或者,采用现代的 ES6 风格

elems.sort((a, b) => a.id - b.id);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接