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

第1引数「配列」のみだと配列の中をソートしてくれる。第2引数は配列の中の値がObjectの時のソートする基準となるkeyを指定する。

■使用例

var arr = [ 5, 2, 3, 6, 7, 4, 8, , 9, 10 ];
// re = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, undefined ];
var re = _.sortBy( arr );

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 = [
{"title":"Final Fantasy4 Original SoundTrack","year":1991,"author":"Nobuo Uematu"},
{"title":"Final Fantasy5 Original SoundTrack","year":1992,"author":"Nobuo Uematu"},
{"title":"Final Fantasy6 Original SoundTrack","year":1992,"author":"Nobuo Uematu"},
{"title":"悪魔城ドラキュラX 月下の夜想曲","year":1994,"author":"Michiru Yamane"}
];
var re = _.sortBy( obj, func );

■内部構造

  _.sortBy = function(obj, iteratee, context) {

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

// _.map() は { value, index, iterateeを適用した値 } の配列を作る。
    return _.pluck(_.map(obj, function(value, index, list) {
      return {
        value: value,
        index: index,
        criteria: iteratee(value, index, list)
      };

// Array.sort()で上記で作成した配列をソートする。
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;

// _.pluck() で value(Object)を抽出した配列を返す。
    }), "value");
  };

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