繁体   English   中英

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

[英]How sort a table with JavaScript?

嗨,我想在单击 header 时使用 JavaScript 对我的波斯表进行排序。 我使用 w3school 示例。 它在英语中可以正常工作,但在波斯语中,某些字符无法计算(گچپژ)进行排序。 数字也不正确,例如,它不是(1,2,3,4,5,6,7,9,10,11),而是返回(1,10,11,2,3,4,5,6 ,7,8,9)。 我怎样才能解决这个问题? 我使用的代码是:

 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>

排序无法正常工作的主要原因是因为您将其排序为字符串。 解决方案是将字符串转换为数字,以便排序行为按预期工作。

下面是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