Jquery错误地按</li>排序<li>

时间:2014-12-16 09:06:18

标签: javascript jquery html arrays sorting

我有<li>按ID排序:

<ul id="members-list">
   <li id="member_8">
   <li id="member_4">
   <li id="member_7">
   <li id="member_12">
   <li id="member_11">
   <li id="member_13">
   <li id="member_5">
   <li id="member_6">
   <li id="member_9">
   <li id="member_3">
   <li id="member_2">
   <li id="member_1">
   <li id="member_10">
</ul>

我使用的代码:

<script>
$( document ).ready(function() {
    $("li[id*='member_']").sort(function (a, b) {
        return parseInt(a.id.replace('member_', '')) > parseInt(b.id.replace('member_', ''));
    }).each(function () {
        var elem = $(this);
        elem.remove();
        $(elem).appendTo("ul#members-list");
    });
});
</script>

结果是:

<ul id="members-list">
   <li id="member_5">
   <li id="member_8">
   <li id="member_7">
   <li id="member_1">
   <li id="member_2">
   <li id="member_3">
   <li id="member_4">
   <li id="member_6">
   <li id="member_9">
   <li id="member_10">
   <li id="member_11">
   <li id="member_12">
   <li id="member_13">
</ul>

<li>没有正确排序,会导致什么问题?

2 个答案:

答案 0 :(得分:6)

问题是您没有正确实现sort功能。该函数应该返回正数,负数或零;你回来是真假。

因此,当a.id小于/等于b.id时,函数返回false,即0-ish;被视为 a.id等于b.id ;这会使排序功能脱离轨道。

解决方案是改变这个:

return parseInt(a.id.replace('member_', '')) > parseInt(b.id.replace('member_', ''));

对此:

return parseInt(a.id.replace('member_', '')) - parseInt(b.id.replace('member_', ''));

说了这么多,你可以使用detach和一个appendTo重写你的代码:

$("li[id*='member_']").detach().sort(function(a, b) {
    return +a.id.replace("member_", "") - b.id.replace("member_", "");
}).appendTo("ul#members-list");

答案 1 :(得分:3)

假设您没有两次相同的号码,您可以使用:

return (parseInt(a.id.replace('member_', '')) > parseInt(b.id.replace('member_', ''))) ? 1 : -1;

Salman答案适用于所有情况。

sort()期望值1,0,-1为返回值:Array.prototype.sort(),因此您不应使用&gt;登录。