Сортировка массива объектов Javascript по дате


Answers

После исправления JSON это должно сработать.

var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM'},{id: 2, date:'Mar 8 2012 08:00:00 AM'}];


array.sort(function(a,b){
var c = new Date(a.date);
var d = new Date(b.date);
return c-d;
});
Question

Скажем, у меня есть массив из нескольких объектов:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}];

Как я могу отсортировать этот массив по элементу даты в порядке от даты, ближайшей к текущей дате и времени? Имейте в виду, что массив может иметь много объектов, но для простоты я использовал 2.

Использую ли я функцию сортировки и пользовательский компаратор?

ОБНОВИТЬ

В моем конкретном случае я хотел, чтобы даты были расположены от самых последних до самых старых. В итоге оказалось, что мне пришлось отменить логику простой функции так:

array.sort(function(a, b) {
    a = new Date(a.dateModified);
    b = new Date(b.dateModified);
    return a>b ? -1 : a<b ? 1 : 0;
});

Это относится к датам с самых последних.




Ваши данные нуждаются в некоторых исправлениях:

var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}];

После исправления данных вы можете использовать этот фрагмент кода:

function sortFunction(a,b){  
    var dateA = new Date(a.date).getTime();
    var dateB = new Date(b.date).getTime();
    return dateA > dateB ? 1 : -1;  
}; 

var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}];
array.sort(sortFunction);​



я смог выполнить сортировку с использованием следующих строк:

array.sort(function(a, b) {
if (a.AffiliateDueDate > b.AffiliateDueDate) return 1;
if (a.AffiliateDueDate < b.AffiliateDueDate) return -1;
                                   })



Я только что взял преобразование Шварца, изображенное выше и сделанное как функция. Он принимает array , function сортировки и логическое значение в качестве входных данных:

function schwartzianSort(array,f,asc){
    for (var i=array.length;i;){
      var o = array[--i];
      array[i] = [].concat(f.call(o,o,i),o);
    }
    array.sort(function(a,b){
      for (var i=0,len=a.length;i<len;++i){
        if (a[i]!=b[i]) return a[i]<b[i]?asc?-1:1:1;
      }
      return 0;
    });
    for (var i=array.length;i;){
      array[--i]=array[i][array[i].length-1];
    }
    return array;
  }

function schwartzianSort(array, f, asc) {
  for (var i = array.length; i;) {
    var o = array[--i];
    array[i] = [].concat(f.call(o, o, i), o);
  }
  array.sort(function(a, b) {
    for (var i = 0, len = a.length; i < len; ++i) {
      if (a[i] != b[i]) return a[i] < b[i] ? asc ? -1 : 1 : 1;
    }
    return 0;
  });
  for (var i = array.length; i;) {
    array[--i] = array[i][array[i].length - 1];
  }
  return array;
}

arr = []
arr.push({
  date: new Date(1494434112806)
})
arr.push({
  date: new Date(1494434118181)
})
arr.push({
  date: new Date(1494434127341)
})

console.log(JSON.stringify(arr));

arr = schwartzianSort(arr, function(o) {
  return o.date
}, false)
console.log("DESC", JSON.stringify(arr));

arr = schwartzianSort(arr, function(o) {
  return o.date
}, true)
console.log("ASC", JSON.stringify(arr));




Я собираюсь добавить это здесь, так как некоторые виды использования могут не сработать, как инвертировать этот метод сортировки.

Чтобы сортировать по 'come up', мы можем просто поменять a & b, например:

your_array.sort ( (a, b) => {
      return new Date(a.DateTime) - new Date(b.DateTime);
});

Обратите внимание, что a теперь находится с левой стороны, а b - справа: D!




Вы можете использовать sortBy в подчеркивании js.

http://underscorejs.org/#sortBy

Образец:

var log = [{date: '2016-01-16T05:23:38+00:00', other: 'sample'}, 
           {date: '2016-01-13T05:23:38+00:00',other: 'sample'}, 
           {date: '2016-01-15T11:23:38+00:00', other: 'sample'}];

console.log(_.sortBy(log, 'date'));



Links