2016-05-06 5 views
0

私の問題が何であるかは完全にはわかりません。私は「テーブル」(未実際のHTMLテーブル)ソート以下のソートの手順があります。ループでJavaScriptソートの問題

function sortByName(tableBody) { 
    var projectList = []; 
    for (var i = 0; i < tableBody.length; i++) { 
     projectList.push(tableBody[i]); 
    } 
    console.log("about to enter"); 
    //console.log(tableRows); 
    for(var i = 0; i < tableBody.length; i++){ 
     var currentRow = tableBody[i]; 
     if(currentRow.innerText !== null){ 
      currentRow.style.display ="none"; 
     } 
    } 
    projectList.sort(function(a,b){ 
     var nameA = a.innerText.toUpperCase(); // ignore upper and lowercase 
     var nameB = b.innerText.toUpperCase(); // ignore upper and lowercase 
     if (nameA < nameB) { 
      return -1; 
     } 
     if (nameA > nameB) { 
      return 1; 
     } 

     // names must be equal 
     return 0; 
    }); 
    console.log(projectList); 

    for(var q = 0; q < projectList.length; q++){ 
     redisplayProjects(q, projectList); 
    } 
} 

function redisplayProjects(index, projectList){ 
    console.log(projectList); 
    projectList[index].style.display = 'block'; 
} 

コンソールに表示し、projectListは実際にコンソールにそれに戻ってstyle.displayを切り替える時にソートされています'ブロック'は、行が事前ソートされたのと同じ順序で表示されます。私は誰もが助けることができる何かを逃していますか?

+0

実際には、DOMの要素の順序ではなく**配列**をソートしています。要素を並べ替えるには、DOM内で場所を入れ替えるか、CSSを使用する必要があります。つまり、フレックスボックスと組み合わせたオーダーです。 –

+0

なぜ配列の並べ替えが実際のDOMに影響を与えると思いますか? –

+0

DOM要素を含む配列をソートすることはDOMに何の影響も与えません。配列をソートした後、** Node.appendChild **を使用してDOMの新しい順序に配置できます:https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild –

答えて

2

sortByName関数の引数tableBodyは、特定のテーブルのDOM行コレクションを期待していると仮定すると - 私もこの、インスタントソート機能であることを仮定している、これを使用:

function sortByName(tableBody) { 
    var i = 0, projectList = [].slice.call(tableBody). 

    sort(function(a, b){ 
     var A = a.innerText.toUpperCase(), B = b.innerText.toUpperCase(); 
     return A < B ? -1 : A > B ? 1 : 0; 
    }), wrapper = tableBody[0].parentElement; 

    while(projectList[i])wrapper.appendChild(projectList[i++]); 
} 

要素の表示スタイルプロパティを切り替える必要はありません。要素の並べ替え順に即座に配置されます。

よろしくお願いいたします。

p.s:まだわからないtableBodyは実際にはこの情報の更新によって、指定された機能がさらに微調整する必要がないかもしれません。

+0

tableBodyは本質的に、私の実装では、divのコレクションで、行のように動作します。 そのようなものvar tableBody = document.querySelectorAll( "。tableRows"); 上記のコメントの後で、あなたの実装は本質的に私の結果です。だから私はあなたの答えとして答えます。どうもありがとう! – RunFranks525

+0

アップデートを確認してください - divコレクションでも動作するはずです。 'sortByName(document.querySelectorAll("。tableRows "))' –

1

tableBody(それが何であれ)の要素から配列を作成し、それらの要素をその配列内に再配置しました。しかし、tableBody自体には何も変更を加えていません。希望する結果が得られていなくても、tableBodyに何が入っているのかは分かりません。