• JQuery incorrectly sorts <li> by id

    I have this <li> for sorting by 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> 

    The code I'm using is:

     <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> 

    Result:

     <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> not sorted correctly, what might cause the problem?

    +5
    source share
    2 answers

    The problem is that you did not implement the sort function correctly. The function must return a positive number, a negative number, or zero; you return true / false.

    So, when a.id is less than / equal to b.id, the function returns false, which is zero; which is considered as a.id, is equal to b.id; this disables the sort function.

    The solution is to change this:

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

    For this:

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

    Having said all this, you can rewrite your code with detach and one appendTo as follows:

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

    provided that you do not have the same number twice, you can use this:

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

    Salman Answer works for all cases.

    sort () expects a value of 1.0, -1 as the return value: Array.prototype.sort () , so you shouldn't use the> sign.

    +3
    source

    Source: https://habr.com/ru/post/1209209/


    All Articles