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>
пример скрипта
Ответы
Ответ 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/