简体   繁体   English

如何使用 JavaScript 对表格进行排序?

[英]How sort a table with JavaScript?

Hi I want sort my Persian table with JavaScript when click on header.嗨,我想在单击 header 时使用 JavaScript 对我的波斯表进行排序。 I use the w3school example.我使用 w3school 示例。 it is work correctly in English but in Persian some character not compute (گچ پژ) for sorting.它在英语中可以正常工作,但在波斯语中,某些字符无法计算(گچپژ)进行排序。 also the number is incorrect and for example Instead of (1,2,3,4,5,6,7,9,10,11), it returns(1,10,11,2,3,4,5,6,7,8,9).数字也不正确,例如,它不是(1,2,3,4,5,6,7,9,10,11),而是返回(1,10,11,2,3,4,5,6 ,7,8,9)。 how can I fix this?我怎样才能解决这个问题? the code I use is:我使用的代码是:

 function sortTable(n) { var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; table = document.getElementById("myTable"); switching = true; //Set the sorting direction to ascending: dir = "asc"; /*Make a loop that will continue until no switching has been done:*/ while (switching) { //start by saying: no switching is done: switching = false; rows = table.rows; /*Loop through all table rows (except the first, which contains table headers):*/ for (i = 1; i < (rows.length - 1); i++) { //start by saying there should be no switching: shouldSwitch = false; /*Get the two elements you want to compare, one from current row and one from the next:*/ x = rows[i].getElementsByTagName("TD")[n]; y = rows[i + 1].getElementsByTagName("TD")[n]; /*check if the two rows should switch place, based on the direction, asc or desc:*/ if (dir == "asc") { if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { //if so, mark as a switch and break the loop: shouldSwitch = true; break; } } else if (dir == "desc") { if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { //if so, mark as a switch and break the loop: shouldSwitch = true; break; } } } if (shouldSwitch) { /*If a switch has been marked, make the switch and mark that a switch has been done:*/ rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); switching = true; //Each time a switch is done, increase this count by 1: switchcount++; } else { /*If no switching has been done AND the direction is "asc", set the direction to "desc" and run the while loop again.*/ if (switchcount == 0 && dir == "asc") { dir = "desc"; switching = true; } } } }
 <table class="table table-light table-striped border table-hover text-center w-100" id="myTable"> <thead class="table thead-dark"> <tr> <th style="cursor:pointer" onclick="sortTable(0)"><i class="bi bi-sort-down"></i>ردیف</th> <th style="cursor:pointer" onclick="sortTable(1)">نام<i class="bi bi-sort-down"></i></th> <th style="cursor:pointer" onclick="sortTable(2)">فامیل<i class="bi bi-sort-down"></i></th> <th style="cursor:pointer" onclick="sortTable(3)"><i class="bi bi-sort-down"></i>ایمیل</th> <th style="cursor:pointer" onclick="sortTable(4)"><i class="bi bi-sort-down"></i>نوع کاربری</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>صادق</td> <td>شجاعی فرد</td> <td>john@example.com</td> <td>ادمین</td> </tr> <tr> <td>2</td> <td>سعید</td> <td>شجاعی فرد</td> <td>mary@example.com</td> <td>ادمین</td> </tr> <tr> <td>3</td> <td>حسین</td> <td>مرادی</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>4</td> <td>مریم</td> <td>آرش</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>5</td> <td>پویان</td> <td>جزینی</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>6</td> <td>آرش</td> <td>ابراهمی</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>7</td> <td>حامد</td> <td>امیر خسرو</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>8</td> <td>جواد</td> <td>گودرزی</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>9</td> <td>یوسف</td> <td>معمار</td> <td>july@example.com</td> <td>عادی</td> </tr> <tr> <td>10</td> <td>ژاله</td> <td>ژاله ای</td> <td>july@example.com</td> <td>عادی</td> </tr> </tbody> </table>

The main reason why the sorting does not work properly is because you sort it as string.排序无法正常工作的主要原因是因为您将其排序为字符串。 The solution is to convert the string to number so the sorting behaviour works as expected.解决方案是将字符串转换为数字,以便排序行为按预期工作。

Below is the change point inside while loop.下面是while循环内的变化点。

  while (switching) {
    //start by saying: no switching is done:
    switching = false;
    rows = table.rows;
    /*Loop through all table rows (except the
        first, which contains table headers):*/
    for (i = 1; i < rows.length - 1; i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*Get the two elements you want to compare,
            one from current row and one from the next:*/
      x = rows[i].getElementsByTagName("td")[n].innerHTML;
      y = rows[i + 1].getElementsByTagName("td")[n].innerHTML;
      /*check if the two rows should switch place,
            based on the direction, asc or desc:*/

      let first = 0;
      let second = 0;

      if (n === 0) {
        first = parseInt(x);
        second = parseInt(y);
      } else {
        first = x.localeCompare(y, "fa");
      }

      if (
        (dir == "asc" && first > second) ||
        (dir == "desc" && first < second)
      ) {
        //if so, mark as a switch and break the loop:
        shouldSwitch = true;
        break;
      }
    }

    if (shouldSwitch) {
      /*If a switch has been marked, make the switch
            and mark that a switch has been done:*/
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      //Each time a switch is done, increase this count by 1:
      switchcount++;
      continue;
    }
    /*If no switching has been done AND the direction is "asc",
            set the direction to "desc" and run the while loop again.*/
    if (switchcount == 0 && dir == "asc") {
      dir = "desc";
      switching = true;
    }
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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