第1引数「配列」の各値を第2引数「関数」でグループ分けした Object を返す。ただし各グループ、値は1つずつ。
■使用例
var arr = [ 1.3, 2.1, 2.4 ];
var func = function( num ){
return Math.floor( num );
}
// re = {"1":1.3,"2":2.4};
var re = _.indexBy( 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 Fantasy6 Original SoundTrack","year":1992,"author":"Nobuo Uematu"},
"1991":{"title":"Final Fantasy4 Original SoundTrack","year":1991,"author":"Nobuo Uematu"}
}
var re = _.indexBy( obj, func );
■内部構造
// group()の最後に function(result, value, key) { } が呼び出される。
_.indexBy = group(function(result, value, key) {
result[key] = value;
});
var group = function(behavior) {
// _.indexBy() の引数は以下の返される関数に代入される。
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;
};
};