1

ソートするすべてのデータが等しい場合、javascriptのリバースメソッドに問題があります。

ここに私のコードがあります:

var ascAgt = false;
        function sortTableAgt() {
            var tbl = document.getElementById("mytable").tBodies[0];
            var store = [];
            for (var i = 0, len = tbl.rows.length; i < len; i++) {
                var row = tbl.rows[i];
                var rowdatedata = row.cells[1].innerHTML;
                store.push([rowdatedata, row]);
            }
            if (ascAgt) {
                store.sort();
                ascAgt = false;
            } else {
                store.sort();
                store.reverse();
                ascAgt = true;
            }
            for (var i = 0, len = store.length; i < len; i++) {
                var idno = i + 1;
                store[i][1].cells[0].innerHTML = idno.toString();
                tbl.appendChild(store[i][1]);
            } store = null;
        }

サンプルデータ:

ID  Name    Date
1   XXXXX   2012/10/05
2   XXXXX   2012/03/16
3   XXXXX   2012/05/18
4   XXXXX   2012/05/18

名前の部分を並べ替えると、名前が等しいために何も起こらないことが必要ですが、逆の方法になると、指定されたデータが逆になります。私はここで何かを逃していますか?前もって感謝します....

4

1 に答える 1

2

したがって、必要なのは2列目でソートし、値が等しい場合は3列目でもソートすることです。右?

このsort()関数はコールバックも受け取ります。あなたはそれを使わなければなりません。

var ascAgt = false;

function sortTableAgt() {
  var table = document.getElementById("mytable").tBodies[0],
      rows = table.rows,
      len = rows.length,
      i = 0,
      store = [],
      order = ascAgt ? 1 : -1;

  for (i = 0; i < len; i++) {
    store.push(rows[i]);
  }

  store.sort(function(a, b) {
    if (a.cells[1].innerHTML == b.cells[1].innerHTML) {

      // If 2nd cell are equal, sort by 3rd cell
      // Compare them as date (timestamp)
      var dateA = new Date(a.cells[2].innerHTML).getTime(),
          dateB = new Date(b.cells[2].innerHTML).getTime();

      if (dateA == dateB) {
        return 0;
      } else if (dateA < dateB) {
        return -1 * order;
      } else {
        return 1 * order;
      }

    } else if (a.cells[1].innerHTML < b.cells[1].innerHTML) {
      return -1 * order;
    } else {
      return 1 * order;
    }
  });

  for (i = 0; i < len; i++) {
    store[i].cells[0].innerHTML = (i+1).toString();
    table.appendChild(store[i]);
  }
}

JSBin でこのデモを確認することもできます: http://jsbin.com/welcome/39336/edit

于 2012-10-25T14:41:09.100 に答える