Array.sort无法正常工作

时间:2015-12-07 18:47:48

标签: javascript sorting

我需要sort函数来对从最早日期到最晚日期的日期进行排序。我可以在我的任务表中做些什么来解决这个问题?

var tasks = new Array();
var index = 0;

function addTask() {
    var temptask = document.getElementById("taskinfo").value;
    var td = document.getElementById("taskdate").value;
    var tempdate = new Date(td);

    //add array and populate from tempdate and temptask
    //generate html table from 2d javascript array
    tasks[index] = {
        Date: tempdate,
        Task: temptask,
    };  

    index++

    tasks.sort(function(a,b){return new Date(b.Date).getTime() - new Date(a.Date).getTime()});

    var tablecode = "<table class = 'tasktable'>" +
        "<tr>"+
        "<th>Date</th>"+
        "<th>Task</th>"+
        "</tr>";
    for (var i = 0; i < tasks.length; i++) {
        tablecode = tablecode + "<tr>" +
            "<td>" + tasks[i]["Date"].toDateString() + " </td>" +
            "<td>" + tasks[i]["Task"] + " </td>" +
            "</tr>";
    }

    tablecode = tablecode + "</table>";

    document.getElementById("bottomright").innerHTML = tablecode;

    return false;
}

我尝试了很多不同的语法变体,无法让sort函数按降序排序

2 个答案:

答案 0 :(得分:0)

您从a.Date中减去b.Date,与您想要的完全相反。

翻转它们(并删除不必要的new Date()包装器,虽然它们实际上并没有破坏任何东西)并且你会得到正确的排序:

var tasks = [],
    index = 0;

function addTask() {
  var temptask = document.getElementById("taskinfo").value;
  var td = document.getElementById("taskdate").value;
  var tempdate = new Date(td);

  tasks[index] = {
    Date: tempdate,
    Task: temptask,
  };

  index++

  tasks.sort(function(a, b) {
    return a.Date.getTime() - b.Date.getTime()
  });

  var tablecode = "<table class='tasktable'>" +
    "<tr>" +
    "<th>Date</th>" +
    "<th>Task</th>" +
    "</tr>";
  for (var i = 0; i < tasks.length; i++) {
    tablecode += "<tr>" +
      "<td>" + tasks[i]["Date"].toDateString() + " </td>" +
      "<td>" + tasks[i]["Task"] + " </td>" +
      "</tr>";
  }

  tablecode += "</table>";

  document.getElementById("bottomright").innerHTML = tablecode;

  return false;
}

document.getElementById('add').addEventListener('click', addTask);
<p>Task:
<input type="text" id="taskinfo" /></p>

<p>Date:
<input type="date" id="taskdate" /></p>

<button id="add">add</button>

<div id="bottomright"></div>

答案 1 :(得分:0)

由于日期表示为

  

自UTC时间1970年1月1日起的毫秒数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

您要查找的排序顺序是升序而不是降序。 另外,正如@birdspider已经评论过的那样,没有使用创建新的Date对象和调用getTime()方法。它们具有可比性。

总结以上几点,请尝试使用以下排序功能:

function sortDatesAsc(tempdateA, tempdateB) {
    return tempdateA - tempdateB < 0 ? -1 : (tempdateA > tempdateB ? 1 : 0);
}

tasks.sort(sortDatesAsc);