Сортировка вложенных массивов объектов по дате - PullRequest
4 голосов
/ 15 февраля 2012

Я пытаюсь отсортировать массив, который выглядит следующим образом:

var dateGroups = [
  [
     {age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)}, 
     {age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)}, 
     {age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
  ],
  [
     {age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)}, 
     {age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)}, 
  ],
  [
     {age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)}, 
     {age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
  ]
]

Объекты внутри вложенных массивов dateGroups уже отсортированы в порядке возрастания, но я также хочу отсортировать сами массивы на основесгруппированные даты.

В этом случае массив должен выглядеть следующим образом:

var dateGroups = [
  [
     {age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)}, 
     {age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)}, 
  ],
  [
     {age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)}, 
     {age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)}, 
     {age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)}
  ],
  [
     {age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)}, 
     {age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)},
  ]
]

Функция, используемая для сортировки, должна также возвращать новую отсортированную версию dateGroups.

Я пытался использовать функцию Underscore.js sortBy(), но я не могу понять, как сортировать массивы на основе значения свойства внутри одного из объектов.Есть ли конкретный способ сортировки объектов Date?Или они отсортированы так же, как цифры или буквы?

Ответы [ 3 ]

9 голосов
/ 15 февраля 2012

Согласно документации Underscore.js, вы должны просто написать свой собственный итератор для этой цели.Как то так:

_.sortBy(dateGroups, function(arrayElement) {
    //element will be each array, so we just return a date from first element in it
    return arrayElement[0].date.getTime();
});
4 голосов
/ 15 февраля 2012

Вы можете отсортировать их, передав пользовательскую функцию сортировки в Array.sort.

dateGroups.sort(function(a, b) {
    return b[0].date.getTime() - a[0].date.getTime();
});

Пользовательская функция должна возвращать число меньше нуля (a предшествует b), больше нуля (a следует после b) или нуля (a и b равны).

1 голос
/ 15 февраля 2012

Насколько я понимаю ваш вопрос, вы хотите отсортировать внутренние группы так, чтобы сначала отображались ранние даты, а затем сортировать группы по их первым датам.Это можно сделать так:

var sortedDateGroups = dateGroups.map(function(dateGroup) {
  // sort the inner groups
  dateGroup.sort(function(a,b) { 
    return a.date.getTime() - b.date.getTime();
  });
  return dateGroup;
}).sort(function(a,b) {
  // sort the outer groups
  return a[0].date.getTime() - b[0].date.getTime();
});

Конечно, это можно сделать с подчеркиванием j таким же образом:

var sortedDateGroups = _.chain(dateGroups).map(function(dateGroup) {
  return _.sortBy(dateGroup, function(inner) {
    return inner.date.getTime();
  });
}).sortBy(function(outer) {
  return outer[0].date.getTime();
}).value()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...