【问题标题】:Sort a list by id by using javascript [duplicate]使用javascript按id对列表进行排序[重复]
【发布时间】:2014-07-02 21:21:34
【问题描述】:

我正在 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/

我在 chrome 上试过了,它运行良好。但是,如果我尝试使用 phonegap 应用程序,列表排序不正确。它不遵循任何顺序。有什么解决方案吗? P/s: 有人说在 Safari 上应该是 (new Date(a.id) - new Date(b.id)) 在 Safari 上但似乎不影响 phonegap

详细说明我的 phonegap 代码。此代码从 db 中检索记录并将其显示为 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');

}

【问题讨论】:

  • 比较函数必须返回一个整数。您的比较函数返回truefalse
  • 为什么要将 ID 转换为 Date
  • 我转换为日期,因为我想检查项目 a 的日期是晚于还是早于项目 b 的日期,以便我可以正确订购它们
  • ID 是 4112 和 6640 之类的小数字——它们是什么类型的日期?
  • 因为列表的内容包含很多信息,包括日期。但我不知道如何只检索内容中的日期,所以我使用这个技巧将日期添加到 ID 中,这样我就可以从 ID 中获取日期值并对它们进行排序

标签: javascript list sorting cordova


【解决方案1】:

比较函数必须返回一个整数。 sort 检查它是负数、零还是正数,并使用它来确定两个元素的排序方式。这样做:

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

或者,在现代ES6 style

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2022-12-18
    • 2019-11-13
    • 2015-09-21
    • 1970-01-01
    • 2021-07-14
    • 2010-10-26
    相关资源
    最近更新 更多