![](/img/trans.png)
[英]Sorting list items by data attribute, alphabetically and then numerically
[英]Javascript: Sort li items alphabetically by data attribute without jquery
我正在尝试仅使用javascript按字母顺序对列表进行排序。
我已经没有使用jquery这样的类似功能:
$('.articles').append($('#articles-non-attached li'));
var alphabeticallyOrderedDivs = $('.articles li').sort(function(a, b) {
return String.prototype.localeCompare.call($(a).data('title').toLowerCase(), $(b).data('title').toLowerCase());
});
但是现在我只需要使用Javascript。
到目前为止,我已经:
var stores_li = document.querySelectorAll('.store-list-item'); //stores_li.sort(); [].slice.call(stores_li).sort(function(a, b) { var textA = a.getAttribute('data-title').toLowerCase() var textB = b.getAttribute('data-title').toLowerCase() return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; //return String.prototype.localeCompare.call(textA,textB); });
<ul> <li class="store-list-item" data-title="a">Test 1</li> <li class="store-list-item" data-title="c">Test 3</li> <li class="store-list-item" data-title="b">Test 2</li> <li class="store-list-item" data-title="d">Test 4</li> </ul>
您需要附加新排序的项目。
var stores_li = document.querySelectorAll('.store-list-item'); [].slice.call(stores_li).sort(function(a, b) { var textA = a.getAttribute('data-title').toLowerCase() var textB = b.getAttribute('data-title').toLowerCase() return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; }) .forEach(function(el) {el.parentNode.appendChild(el)});
<ul> <li class="store-list-item" data-title="a">Test 1</li> <li class="store-list-item" data-title="c">Test 3</li> <li class="store-list-item" data-title="b">Test 2</li> <li class="store-list-item" data-title="d">Test 4</li> </ul>
这是因为原生.sort()
方法不是DOM方法; 它只是对数组项的任意列表进行排序。 因此,通过附加新排序的项目,它将新元素顺序提交给DOM。
请注意,上面的简单解决方案假定它们都共享相同的父对象。
这是具有现代语法和方法的版本:
var stores_li = document.querySelectorAll('.store-list-item'); Array.from(stores_li).sort((a, b) => a.dataset.title.toLowerCase().localeCompare(b.dataset.title.toLowerCase()) ) .forEach(el => el.parentNode.appendChild(el));
<ul> <li class="store-list-item" data-title="a">Test 1</li> <li class="store-list-item" data-title="c">Test 3</li> <li class="store-list-item" data-title="b">Test 2</li> <li class="store-list-item" data-title="d">Test 4</li> </ul>
var stores_li = document.querySelectorAll('.store-list-item');
var sorted = [].slice.call(stores_li).sort(function(a, b) {
var textA = a.dataset.title.toLowerCase();
var textB = b.dataset.title.toLowerCase();
return textA.localeCompare(textB);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.