Подтвердить что ты не робот

Javascript вид HTML-элементов

Я пытаюсь отсортировать элементы 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>

пример скрипта

4b9b3361

Ответ 1

Есть намного лучшие способы сортировки.

  • Вам нужна функция сравнения, которая возвращает правильные значения: -1, 0 и 1.
  • localeCompare() - такая функция сравнения.
  • Вы можете просто перемещать элементы DOM, а не восстанавливать HTML.
  • Вы можете получить элементы LI непосредственно в исходном селекторе.
  • "#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/

Ответ 2

A custom 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;
}

Ответ 3

var sort_by_name = function(a, b) {
    return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
}

Вместо этого вы можете использовать localeCompare, чтобы сделать вещи более элегантными и работоспособными.

См. jsfiddle http://jsfiddle.net/Qww87/11/

Ответ 4

согласно документации ему нужны числовые значения. более понятным:

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

Ответ 5

Использовать мой плагин jquery Сортировка содержимого:

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

Что это!

ДЕМО: http://jsfiddle.net/abdennour/SjWXU/