第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");
};