对对象数组进行分组和排序的最佳方法

时间:2013-12-02 13:58:01

标签: javascript underscore.js

我有以下演示数据。

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

第一个控制台输出以排序数据后我想要的格式显示数据。

希望有人能指出我正确的方向。

3 个答案:

答案 0 :(得分:3)

您可以先对整个阵列进行排序,然后按以下方式进行分组:

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

答案 1 :(得分:1)

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

答案 2 :(得分: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.

  });