groupBy() | Underscore JS 日本語リファレンス

第1引数「配列」の各値を第2引数「関数」でグループ分けした Object を返す。

■使用例

var arr = [ 1.3, 2.1, 2.4 ];

var func = function( num ){
	return Math.floor( num );
}
// re = { "1" : [1.3], "2" : [2.1,2.4] };
var re = _.groupBy( arr, func );

var obj = [ 
    { 
        title : "悪魔城ドラキュラX 月下の夜想曲", 
        year : 1994,
        author : "Michiru Yamane"
    },
    { 
        title : "Final Fantasy5 Original SoundTrack", 
        year : 1992, 
        author : "Nobuo Uematu"
    }, 
    { 
        title : "Final Fantasy4 Original SoundTrack", 
        year : 1991, 
        author : "Nobuo Uematu"
    }, 
    { 
        title : "Final Fantasy6 Original SoundTrack", 
        year : 1992, 
        author : "Nobuo Uematu"
    }
];

var func = function( obj ){
	return obj.year;	
}
// re = {
"1994":[{"title":"悪魔城ドラキュラX 月下の夜想曲","year":1994,"author":"Michiru Yamane"}],
"1992":[{"title":"Final Fantasy5 Original SoundTrack","year":1992,"author":"Nobuo Uematu"},
{"title":"Final Fantasy6 Original SoundTrack","year":1992,"author":"Nobuo Uematu"}],
"1991":[{"title":"Final Fantasy4 Original SoundTrack","year":1991,"author":"Nobuo Uematu"}]
}
var re = _.groupBy( obj, func );

■内部構造

// group()の最後に function(result, value, key) { } が呼び出される。
  _.groupBy = group(function(result, value, key) {

// 「result」Object の中に key のgroup毎の配列に値が分けられる。
    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
  });
  var group = function(behavior) {
  	
// _.groupBy() の引数は以下の返される関数に代入される。
    return function(obj, iteratee, context) {
      var result = {};

// 第3引数が入力されていない、第2引数が関数ならそのまま。
      iteratee = cb(iteratee, context);

      _.each(obj, function(value, index) {
      	
// 第1引数の各値(Object)に第2引数の関数が適用された結果。
        var key = iteratee(value, index, obj);

// group() の引数がセットされ関数として機能する。        
        behavior(result, value, key);
      });
      return result;
    };
  };

このページのトップへ戻る