Как отсортировать массив JSON со временем ?? (не работает, как предлагалось ранее) - PullRequest
0 голосов
/ 24 декабря 2010

со ссылкой на этот вопрос Сортировка массива json

У меня есть следующая строка JSON, использующая ajax, и сохраняется объект в виде массива:

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"
    }
    ];

Как сделатьЯ создаю функцию для сортировки поля «start_date» в ASC, а также сортировки в порядке DESC с использованием только JavaScript?

я использовал нижеприведенную функцию, предложенную 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 ]

1 голос
/ 24 декабря 2010

(Объединение моих комментариев с правильным ответом)

Если все ваши даты в этом формате, то вы можете просто отсортировать обычным сравнением строк.В этом случае это означает, что вы можете просто бросить учебник для начинающих:

homes.sort(sort_by('start_time', false));
1 голос
/ 24 декабря 2010

Как я уже сказал в комментарии, в строке нет метода 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

0 голосов
/ 24 декабря 2010

Для сортировки по возрастанию:

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"]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...