// 归类函数
// 配置项: 所依据的归类数据 fields, 被归类的目标数据datas, 归类的字段mapping_field, 归类类型sortType ("single"/"multi")
// sortType的可选属性"single"指单一归类,"multi"指的是复合归类
function sortDatas(fields, datas){
var cache = {};
return function(mapping_field, sortType){
if(sortType !== 'single' && sortType !== 'multi'){
console.log(new Error('Invlid sort type. Only "single" and "multi" is allowed'));
return;
}
fields.forEach(function(field){
var _id = field.id;
cache[_id] = [];
datas.forEach(function(elem){
var mapping_val = elem[mapping_field];
if(sortType === 'single'){
if(mapping_val == _id){
cache[_id].push(elem);
}
}else if(sortType === 'multi'){
var _arr = mapping_val.split(',');
_arr.forEach(function(val){
if(val == _id){
cache[_id].push(elem);
}
});
}
});
});
return cache;
}
}
//单一归类例子
var sex = [
{id:1, field:"女"},
{id:2, field:"男"}
];
var persons = [
{id:1, name:"小明",sex:2},
{id:2, name:"小黄",sex:2},
{id:3, name:"小黑黑",sex:1},
{id:4, name:"小洪",sex:1},
];
// 依据sex性别进行单一归类
console.log(sortDatas(sex, persons)('sex', "single"))
//复合归类例子
var hobby = [
{id:1,name:'足球'},
{id:2,name:'篮球'},
{id:3,name:'排球'},
{id:4,name:'乒乓球'},
{id:5,name:'保龄球'},
];
var people = [
{id:1, name:'小明',hobby:'1,3'},
{id:2, name:'小黄',hobby:'1,4'},
{id:3, name:'小花',hobby:'2,5'},
{id:4, name:'小白',hobby:'1,3,4'},
{id:4, name:'小青',hobby:'2,3,4'},
{id:5, name:'小洪',hobby:'1,3'},
{id:6, name:'小蓝',hobby:'2,4,5'},
]
// 依据hobby爱好进行单一归类
console.log(sortDatas(hobby, people)('hobby', 'multi'))
single指的是单一类型,如例1中,每个person只有一个对应的性别sex,结果中的每个子元素value值会对应单个sex性别;
multi指的是复合类型,如例2中,每个people可能有多个不同的爱好,因此,依据hobby进行分类的时候,结果中的每个子元素value值会对应到多个hobby爱好