继续javascript sort of HTML elements
我想对不同<ol>
中的元素进行排序(最终在<div>
中)
排序最好是就地而不是unwrap()
,sort()
和wrap
HTML
<ol class="table" 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>
</ol>
<ol class="table">
<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>
的javascript
var sort_by_name = function(a, b) {
return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase());
}
var list = $(".table > li").get();
list.sort(sort_by_name);
for (var i = 0; i < list.length; i++) {
list[i].parentNode.appendChild(list[i]);
}
我寻找的结果是
<ol class="table" style="display: block; ">
<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">I</li>
</ol>
<ol class="table">
<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">IXX</li>
<li class="menu__test">st</li>
<li class="menu__test">st</li>
<li class="menu__test">st</li>
</ol>
设a,b为DOM元素,列表中的b低于b(文档中的位置较低)和值(a)&gt;值(b)然后a和b将在文档中切换。无论a和b可能不是兄弟姐妹。
答案 0 :(得分:4)
通过减少比较来加快任务速度,您可以:
$(".table").each(function(){
var list = $(this).children().get().sort(sort_by_name);
for (var i = 0; i < list.length; i++)
this.appendChild(list[i]);
});
......虽然它不会影响结果。
var $t = $(".table");
var list = $t.children().get().sort(sort_by_name);
$t.map(function() {
return {t:this, l:this.childNodes.length};
}).each(function(i, o) {
$(o.t).append(list.splice(0, o.l));
});