简体   繁体   English

Javascript:按数据属性按字母顺序对li项目进行排序,而无需使用jquery

[英]Javascript: Sort li items alphabetically by data attribute without jquery

I'm trying to sort a list alphabetically only using javascript. 我正在尝试仅使用javascript按字母顺序对列表进行排序。

I've already none a similar function using jquery like this: 我已经没有使用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());
        });

But now I need to use just Javascript. 但是现在我只需要使用Javascript。

So far I've got: 到目前为止,我已经:

 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> 

You need to append the newly sorted items. 您需要附加新排序的项目。

 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> 

This is because the native .sort() method isn't a DOM method; 这是因为原生.sort()方法不是DOM方法; it just sorts any arbitrary list of Array items. 它只是对数组项的任意列表进行排序。 So by appending the newly sorted item, it commits the new element order to the DOM. 因此,通过附加新排序的项目,它将新元素顺序提交给DOM。

Note that the simple solution above assumes they all share the same parent. 请注意,上面的简单解决方案假定它们都共享相同的父对象。


Here's a version with modern syntax and methods: 这是具有现代语法和方法的版本:

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM