Разделить массив объектов на новые массивы в зависимости от года даты объекта

У меня есть массив объектов с именем objarray. Каждый объект выглядит так:

var object = {
    age: "45"
    coords: "-37.807997 144.705784"
    date: Sun Jul 28 2002 00:00:00 GMT+1000 (EST)
}

(date – это объект даты)

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

var dateGroups = [[object, object, object],[object, object], [object, object, object]];

Каждый массив в dateGroups содержит объекты с одинаковой датой.

Возможно ли это сделать с массивами? Ранее я создал новый объект, который содержал все объекты objarray, сгруппированные по дате (даты, сгенерированные из данных):

var alldates = {
  "1991" : [object, object, object],
  "1992" : [object, object],
  //etc...
}

Вышеупомянутое решение кажется странным на практике, хотя мне нужно иметь доступ к объектам только по годам: т.е. dateGroups[0] = массив объектов с первого года

Как мне получить данные во что-то вроде массива dateGroups? Есть ли лучший способ хранения данных такого типа?


person tamarasaurus    schedule 14.02.2012    source источник
comment
лучше выбрать для этого JSON.   -  person Chamika Sandamal    schedule 14.02.2012
comment
Какая структура JSON подойдет для группировки по дате?   -  person tamarasaurus    schedule 14.02.2012


Ответы (3)


Рассмотрите возможность использования Underscore.js groupBy, за которой следует sortBy .

groupBy создаст структуру, подобную alldates, если вы назовете ее так:

var alldates = _.groupBy(objarray, function(obj) {
    return obj.date.getFullYear();
});

sortBy можно использовать для простой сортировки по ключу, например:

var dateGroups = _.sortBy(alldates, function(v, k) { return k; });

Вы также можете комбинировать их следующим образом:

var dateGroups = _.chain(objarray)
                  .groupBy(function(obj) { return obj.date.getFullYear(); })
                  .sortBy(function(v, k) { return k; })
                  .value();

В зависимости от вашего варианта использования я могу увидеть причины для использования массива массивов или карты объектов массивов. Если вы ищете индекс, обязательно используйте более поздний.

person tjdett    schedule 14.02.2012
comment
Это работало фантастически. Спасибо! Мне определенно нужно будет использовать индексы позже. - person tamarasaurus; 14.02.2012

Ответ с использованием сокращения.

var ans = objects.reduce(function(prev,curr) {
    if (!prev[curr.date.getFullYear()]) prev[curr.date.getFullYear()] = [];
    prev[curr.date.getFullYear()] = curr;
    return prev;
},[]).reduce(function(prev,curr) {
    prev.push(curr);
    return prev;
},[]);

первое сокращение предназначено для группировки объектов по датам, а второе - для того, чтобы ключ массива работал от 0 до количества разных лет - вместо того, чтобы ключ был самим годом.

person naortor    schedule 04.09.2016

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

var alldates = {
  "1991" : [object, object, object],
  "1992" : [object, object],
  //etc...
}

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

var dateGroups = [];

for(var year in allDates){
   dateGroups[dateGroups.length] = allDates[year];
}
person driangle    schedule 14.02.2012