2013-12-02 2 views
2

У меня есть следующие демо-данные.Лучший способ группировки и сортировки массива объектов

var demoData= [{"EntryGroupDate":"November 2013", 
       "DisplayName": "Hans Meier (November)", 
       "EntryGroupDateSort": 11}, 
       {"EntryGroupDate":"August 2013", 
       "DisplayName": "Franz Mueller (August)", 
       "EntryGroupDateSort": 8}, 
       {"EntryGroupDate":"November 2013", 
       "DisplayName": "Franz Huber (November)", 
       "EntryGroupDateSort": 11}, 
       {"EntryGroupDate":"Juli 2013", 
       "DisplayName": "Franz Schmidt (Juli)", 
       "EntryGroupDateSort": 7} 
       ]; 

Что бы лучший способ сгруппировать их по первому EntryGroupDateSort и сортировать их потом по тем же критериям. Для вывода мне нужна вся информация исходного массива.

Я только что поиграл с UnderscoreJS, но не получил желаемого результата, используя следующий код.

var myPersons = demoData; 
var groups = _.groupBy(myPersons, "EntryGroupDate"); 
console.log(groups); 
groups = _(groups).sortBy(function (item) { 
    return item.EntryGroupDateSort; 
}); 
console.log(groups); 

Первый вывод консоли показывает данные в формате, который я хотел бы иметь после сортировки данных.

Надеюсь, кто-то может указать мне в правильном направлении.

+1

Что именно вы подразумеваете под «группой»? Я имею в виду, каков ожидаемый результат? – Aioros

+0

как вы собираетесь это использовать? Мы не можем видеть, что вы видите на консоли, поэтому заявить, что это то, что вы хотите, не помогает. – charlietfl

+0

Сортировка, когда вы ожидаете, что тот же самый элемент появится, группируется. Это заставляет походить на то, что вы хотите сортировать по двум вещам сразу (сортировка по 'EntryGroupDate', если это было' 0', sort by blah) –

ответ

2

Вы можете сделать сортировку через весь массив, а затем группа по:

JSFIDDLE

var demoData= [{"EntryGroupDate":"November 2013", 
       "DisplayName": "Hans Meier (November)", 
       "EntryGroupDateSort": 11}, 
       {"EntryGroupDate":"August 2013", 
       "DisplayName": "Franz Mueller (August)", 
       "EntryGroupDateSort": 8}, 
       {"EntryGroupDate":"November 2013", 
       "DisplayName": "Franz Huber (November)", 
       "EntryGroupDateSort": 11}, 
       {"EntryGroupDate":"Juli 2013", 
       "DisplayName": "Franz Schmidt (Juli)", 
       "EntryGroupDateSort": 7} 
       ]; 


_.sortBy(demoData, function(x){ return x.EntryGroupDateSort; }); 
groups = _.groupBy(demoData, 'EntryGroupDate'); 
console.log(groups); 

Если вы хотите отсортировать после группировки, то вам можно использовать (сортировка по DisplayName в этот раз):

JSFIDDLE

groups = _.groupBy(demoData, 'EntryGroupDate'); 
for (var key in groups) 
    groups[key].sort(function(a,b){ var x = a.DisplayName, y = b.DisplayName; return x === y ? 0 : x < y ? -1 : 1; }); 
console.log(groups); 
+0

Ключи/значения объекта не имеют * гарантированного * заказа. Результат, который я получаю от вашего ответа, не в любом порядке: '[Object] ▶ ︎« Август 2013 »: массив [1],« Juli 2013 »: массив [1],« ноябрь 2013 »: массив [2]' , – idbehold

+0

Это как OP запросил: «Первый вывод консоли показывает данные в формате, который я хотел бы иметь после сортировки данных.« – MT0

+0

OP просил, чтобы ключи сгруппированного объекта сортировались с помощью' EntryGroupDateSort', что невозможно, поскольку ключи объекта не имеют порядка. Ни один из ваших ответов не производит вывод, который ищет OP. Ваш первый ответ был особенно плохим, потому что вы потратили впустую Время процессора для сортировки начального массива, даже если это не имеет значения после того, как вы назовете '_.groupBy()'. – idbehold

0

Попробуйте это,

demoData.sort(function(a, b) { 
     var textA = a.EntryGroupDateSort; 
     var textB = b.EntryGroupDateSort; 

     return (textA < textB) ? 1 : (textA > textB) ? -1 : 0; 
     //return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; //for ascending. 

    }); 
0

_.groupBy() функция возвращает объект и вы не можете «сортировать» объект. Ключи/значения объекта не имеют никакого порядка. Метод _.sortBy() преобразует ваш объект (содержащий только массивы) в массив массивов и сортирует значения на основе EntryGroupDateSort. Проблема в том, что вы пытаетесь отсортировать массив массивов по значению EntryGroupDateSort (что не является свойством массива). То, что вы хотите сделать, это сортировать групповой объект массивов с помощью элемента _.first() в каждом массиве. Ниже вы найдете то, что вы хотите:

var groups = _(demoData).chain() 
    .groupBy("EntryGroupDate") 
    .tap(function(data){ console.log(data) }) 
    .sortBy(function(data){ 
     // Note that we're sorting by EntryGroupDateSort 
     // from the _.first() item in the array 
     return _.first(data).EntryGroupDateSort 
    }) 
    .tap(function(data){ console.log(data) }) 
    .value(); 
Смежные вопросы