我需要对alphaNumeric列表进行排序。我能够排序,但有些如何,因为它是alphaNumeric,我不能把abc1放在abc10之前。
我的HTML代码:
<ul class="theList">
<li><b>abc11:</b>Hello</li>
<li><b>abc10:</b>Hello</li>
<li><b>xyz24:</b>Hello</li>
<li><b>abc1:</b>Hello</li>
<li><b>xyz2:</b>Hello</li>
</ul>我的JavaScript:
$(document).ready(function() {
var list, i, switching, b, shouldSwitch;
list = document.getElementsByClassName("theList");
for (var j = 0; j < list.length; j++) {
switching = true;
while (switching) {
switching = false;
b = list[j].getElementsByTagName("li");
for (i = 0; i < (b.length - 1); i++) {
shouldSwitch = false;
if (b[i].innerHTML.toLowerCase() > b[i + 1].innerHTML.toLowerCase()) {
shouldSwitch = true;
break;
}
}
if (shouldSwitch) {
b[i].parentNode.insertBefore(b[i + 1], b[i]);
switching = true;
}
}
}
});我的结果是:
预期结果:
我遗漏了什么?
发布于 2018-10-22 06:48:55
在文档之外按照自己的数组对li进行排序可能要容易得多,然后再按照正确的顺序将它们附加到ul中。您可以使用localeCompare检查哪个字符串按字典顺序排在第一位,而不需要jQuery:
const theList = document.querySelector('.theList');
const lis = Array.from(theList.children);
const firstText = elm => elm.children[0].textContent;
lis.sort((a, b) => firstText(a).localeCompare(firstText(b)));
lis.forEach(li => theList.appendChild(li));<ul class="theList">
<li><b>abc11:</b>Hello</li>
<li><b>abc10:</b>Hello</li>
<li><b>xyz24:</b>Hello</li>
<li><b>abc1:</b>Hello</li>
<li><b>xyz2:</b>Hello</li>
</ul>
若要对多个此类列表进行排序,请在querySelectorAll上迭代
document.querySelectorAll('.theList').forEach((theList) => {
const lis = Array.from(theList.children);
const firstText = elm => elm.children[0].textContent;
lis.sort((a, b) => firstText(a).localeCompare(firstText(b)));
lis.forEach(li => theList.appendChild(li));
});<ul class="theList">
<li><b>abc11:</b>Hello</li>
<li><b>abc10:</b>Hello</li>
<li><b>xyz24:</b>Hello</li>
<li><b>abc1:</b>Hello</li>
<li><b>xyz2:</b>Hello</li>
</ul>
<ul class="theList">
<li><b>abc11:</b>Hello</li>
<li><b>abc10:</b>Hello</li>
<li><b>xyz24:</b>Hello</li>
<li><b>abc1:</b>Hello</li>
<li><b>xyz2:</b>Hello</li>
</ul>
https://stackoverflow.com/questions/52923644
复制相似问题