Best way to group and sort an array of objects

百般思念 提交于 2019-12-24 04:16:32

问题


I have the following demo data.

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}
              ];

What would be the best way to group them first by EntryGroupDateSort and sort them afterwards by the same criteria. For the output I need all the information of the original array.

I have just fiddled around with UnderscoreJS but did not get the desired result by using the following code.

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

The first console output shows the data in the format I would like to have after sorting the data.

Hopefully someone can point me in the right direction.


回答1:


You can do the sort across the entire array first and then group by:

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 );

If you want to sort after grouping then you can use (sorting on DisplayName this time):

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 );



回答2:


Try this,

 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.

  });



回答3:


The _.groupBy() function returns an object and you cannot "sort" an object. The keys/values of an object do not have any order. The _.sortBy() method transforms your object (containing only arrays) into an array of arrays and sorts the values based on EntryGroupDateSort. The problem is that you're trying to sort the array of arrays by the EntryGroupDateSort value (which isn't a property of an array). What you want to do is sort the grouped object of arrays by the _.first() item in each array. Here's the closest you're going to get to what you want:

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();


来源:https://stackoverflow.com/questions/20330050/best-way-to-group-and-sort-an-array-of-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!