如何按时间对JSON数组进行排序?(不按照之前的建议工作)

时间:2010-12-24 10:38:49

标签: arrays json sorting

参考这个问题Sort json array

我使用ajax获得以下JSON字符串,并将该对象存储为数组:

var homes = [
    {
     "h_id":"3",
     "city":"Dallas",
     "state":"TX",
     "zip":"75201",
     "price":"162500",
     "start_time":"2011-01-26 08:00:00",
     "end_time":"2011-01-26 05:00:00"
    },
    {
     "h_id":"4",
     "city":"Bevery Hills",
     "state":"CA",
     "zip":"90210",
     "price":"319250",
     "start_time":"2011-01-26 12:00:00",
     "end_time":"2011-01-26 05:00:00"
    },
    {
     "h_id":"5",
     "city":"New York",
     "state":"NY",
     "zip":"00010",
     "price":"962500",
     "start_time":"2011-01-28 08:00:00",
     "end_time":"2011-01-26 05:00:00"
    }
    ];

如何创建一个函数来对ASC中的“start_date”字段进行排序,并仅使用JavaScript对DESC排序进行排序?

我使用 Triptych

建议的以下功能
var sort_by = function(field, reverse, primer){

   reverse = (reverse) ? -1 : 1;

   return function(a,b){

       a = a[field];
       b = b[field];

       if (typeof(primer) != 'undefined'){
           a = primer(a);
           b = primer(b);
       }

       if (a<b) return reverse * -1;
       if (a>b) return reverse * 1;
       return 0;

   }
}

并以下面的方式申请

// Sort by start_time
homes.sort(sort_by('start_time', false, function(a){return a.getTime()}));

但没有工作...... :((给出这个错误

a.getTime is not a function

请告诉我我在哪里犯错..

提前致谢

  

注意:抱歉复制相同   问题...

3 个答案:

答案 0 :(得分:1)

正如我在评论中所说,字符串没有getTime()方法。只有Date个对象。因此,您必须将日期字符串转换为Date对象。将您的功能更改为:

function(a){return (new Date(a)).getTime()}

现在,有Date的各种实现,我认为只有较新的实现支持解析这种日期字符串(不确定)。也许你必须首先解析字符串并将单个值传递给Date

function(a){
    var parts = a.match(/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/);
    var date = new Date(parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);
    return date.getTime()}
}

参考:Date

答案 1 :(得分:1)

(将我的评论与正确答案相结合)

如果您的日期都采用该格式,那么您只需按正常的字符串比较进行排序即可。在这种情况下,这意味着你可以放弃底漆:

homes.sort(sort_by('start_time', false));

答案 2 :(得分:0)

升序排序:

var sortAscending = function(a, b) {
  var aDate = new Date(a["start_time"]);
  var bDate = new Date(b["start_time"]);
  return aDate.getTime() - bDate.getTime();
}

homes.sort(sortAscending)

降级排序:

var sortDescending = function(a, b) { return -1 * sortAscending(a, b); }

homes.sort(sortDescending);

这也是降序排序:

var sortDescending = function(a, b) { return sortAscending(b, a); }

正如其他人所提到的,日期的字符串表示是按字典顺序排序的,这意味着可以避免整个日期解析步骤。使用String.localeCompare sortAscending函数可以写成:

var sortAscending = function(a, b) {
  return a["start_time"].localeCompare(b["start_time"]);
}