2017-05-30 2 views
0

単語と数値の両方の列を持つ表をソートしようとしています。言葉は意図したとおりの仕事です。しかし、数字の部分は少しオフです。数値を含む表をソートしようとしています

この列のうちの1つは、価格が500から1500までの列です。しかし今は1500が1500を下回っており、これを修正する方法はわかりません。

function sortTable(n) { 
    var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; 
    table = document.getElementById("allCars"); 
    switching = true; 

    dir = "asc"; 

    while (switching) { 
     switching = false; 
     rows = table.getElementsByTagName("TR"); 
     for (i = 1; i < (rows.length - 1); i++) { 
     shouldSwitch = false; 
     x = rows[i].getElementsByTagName("TD")[n]; 
     y = rows[i + 1].getElementsByTagName("TD")[n]; 
     if (dir == "asc") { 
      if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { 
      shouldSwitch= true; 
      break; 
     } 
     } else if (dir == "desc") { 
     if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { 
      shouldSwitch= true; 
      break; 
     } 
     } 
    } 
    if (shouldSwitch) { 
     rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); 
     switching = true; 
     switchcount ++; 
    } else { 
     if (switchcount == 0 && dir == "asc") { 
     dir = "desc"; 
     switching = true; 
     } 
    } 
    } 
} 
+0

あなたの並べ替えが整数に対して壊れているが、文字列で動作している理由は、整数を文字列として並べ替えているためです。1500から500を比較するには、1が5未満です。より良い)https://softwareengineering.stackexchange.com/a/127644 テーブルの最上位の行(th)の型を定義する属性を考えてみてください。次に、parseIntを使用して知っている値を解析できますこれを手動で行うのではなく、 – Robbie

+1

のintになり、dataTables(datatables.net)がうまく機能します。あなたがそれに反している場合は、数値かどうかを確認し、Number(val)を使って数値に変換してください。 – Simon

答えて

0

これは、ソート方法の順序文字列として数値を引き起こすので、1500年は5

はあなたが前に比較数値をキャストする必要があります前に、500原因1が来る前に来る起こります。

あなたはこのようなものが必要:(HEREコメントの間)

function sortTable(n) { 


var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; 
    table = document.getElementById("allCars"); 
    switching = true; 

    dir = "asc"; 

    while (switching) { 
     switching = false; 
     rows = table.getElementsByTagName("TR"); 
     for (i = 1; i < (rows.length - 1); i++) { 
     shouldSwitch = false; 
     x = rows[i].getElementsByTagName("TD")[n]; 
     y = rows[i + 1].getElementsByTagName("TD")[n]; 
     if (dir == "asc") { 
      if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { 
      shouldSwitch= true; 
      break; 
     } 
     } else if (dir == "desc") { 
     // START HERE 
     var value1 = x.innerHTML; 
     var value2 = y.innerHTML; 

     //CHECK IF VALUES ARE NUMERIC. (LINK LATER) 

     if (isNumeric(value1) && isNumeric(value2)){ 
      if(Number(value1) < Number(value2){ 
       shouldSwitch = true; 
       break; 
      } 
     } else { 

     // FINISH HERE 

      if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { 
       shouldSwitch = true; 
       break; 
     } 
     } 
    } 
    if (shouldSwitch) { 
     rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); 
     switching = true; 
     switchcount ++; 
    } else { 
     if (switchcount == 0 && dir == "asc") { 
     dir = "desc"; 
     switching = true; 
     } 
    } 
    } 
} 

あなたがSE、ISNUMERIC(値)機能を実装していない私のコードは、あなたがそれを実装するのに約validate decimal numbers in JavaScriptを読むことができるように!

+0

時間を割いていただきありがとうございます。私はこの時間を過ごすことはできませんでした、締め切りが過ぎました:)しかし、私は次回このことを覚えています。 –

関連する問題