Разбить массив объектов на новые массивы, основываясь на годе даты объекта - PullRequest
5 голосов
/ 14 февраля 2012

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

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

( date - это объект 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 массив?Есть ли лучший способ для хранения данных этого типа?

Ответы [ 3 ]

8 голосов
/ 14 февраля 2012

Рассмотрите возможность использования функции 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();

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

1 голос
/ 04 сентября 2016

Ответ, использующий уменьшение.

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 до числа разных лет - вместо этогоключом является сам год.

0 голосов
/ 14 февраля 2012

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

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

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

var dateGroups = [];

for(var year in allDates){
   dateGroups[dateGroups.length] = allDates[year];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...