23

我正在尝试对li元素进行排序并得到一个意外的结果我需要对其进行三次排序才能正确获得它,

我错在哪里了?javascript

var sort_by_name = function(a, b) {
    return a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase();
}
$this = $("ol#table1");
var list = $this.children();
list.sort(sort_by_name);
console.log(list);
$this.html(list);

HTML

<ol id="table1" style="display: block; ">
   <li class="menu__run">I</li>
   <li class="menu__run">IXX</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li> 
   <li class="menu__run">IXX</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__run">I</li>
   <li class="menu__test">st</li>
   <li class="menu__test">st</li>
   <li class="menu__test">st</li>
</ol>

小提琴示例

4

5 回答 5

45

有更好的排序方法。

  1. 您需要一个返回正确值的比较函数:-1、0 和 1。
  2. localeCompare()就是这样一个比较函数。
  3. 您可以只移动 DOM 元素而不是重新生成 HTML。
  4. 您可以直接在原始选择器中获取 LI 元素。
  5. "#table1"是比 更有效的选择器"ol#table1"

我建议这样做:

$("div#btn").click(function() {
    var sort_by_name = function(a, b) {
        return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase());
    }

    var list = $("#table1 > li").get();
    list.sort(sort_by_name);
    for (var i = 0; i < list.length; i++) {
        list[i].parentNode.appendChild(list[i]);
    }
});​

你可以在这里看到工作:http: //jsfiddle.net/jfriend00/yqd3w/

于 2012-04-17T06:40:00.057 回答
8

定义 compareFunction需要返回 -1、0 或 1。

function sort_by_name(a, b) {
    var sa = a.innerHTML.toLowerCase(), sb = b.innerHTML.toLowerCase();
    return sb<sa ? -1 : sb>sa ? 1 : 0;
}
于 2012-04-17T06:32:04.607 回答
6
var sort_by_name = function(a, b) {
    return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
}

你可以使用 localeCompare 来让事情变得更加优雅和可行。

见 jsfiddle http://jsfiddle.net/Qww87/11/

于 2012-04-17T06:33:02.467 回答
1

根据文档,它需要数值。更易懂:

    var sort_by_name = function(a, b) {
         if(a.innerHTML.toLowerCase() < b.innerHTML.toLowerCase()) return -1;
         if(a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) return 1;
         return 0;
    }
于 2012-04-17T06:33:42.393 回答
1

使用我的 jquery 插件排序内容:

   $('ol#table1').sortContent({asc:true})

就是这样!

演示:http: //jsfiddle.net/abdennour/SjWXU/

于 2013-09-13T16:59:48.503 回答