2017-10-03 4 views
1

私はアルファベット順にjavascriptを使用してリストをソートしようとしています。Javascript:jqueryを使わないでデータアイテムをアルファベット順にソート

私はすでにどれも、このように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>

+0

問題が何であるか:


ここでは近代的な構文とメソッドを持つバージョンがありますか? – brk

+0

アルファベット順のソートではありません。テスト1、テスト2、テスト3、テスト4が返されます。 しかし、テスト1、テスト3、テスト2、テスト4が返されます。 –

答えて

5

あなたは、新たにソートされた項目を追加する必要があります。

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メソッドではないためです。 Array項目の任意のリストをソートするだけです。したがって、新しくソートされたアイテムを追加することによって、新しいエレメントオーダーを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>

+0

私は2番目のより現代的な解決策と全く同じソリューションを投稿します。すべてが既に小文字であるため、 '.toLowerCase() 'の必要はないと私は思っています。よくやった。 –

+0

@JohnnyKutnowski:ありがとうございました。あなたが正しいです、OPがケースについて確信していない限り、 '.toLowerCase()'は余計です。 – llama

+0

ありがとうございます@ラマ!完全に働いた:) –

0
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); 
}); 
+0

これは良い答えですが、説明が必要です –

関連する問題