本次函数实现使用了参数归一化、泛型知识
groupBy:根据属性字段对数组进行分组
list->需分组的数组
getByKey->分组的依据,可以为数组数据中的属性,也可以为一个回调函数
const groupBy = <T>(list:T[],getByKey:(keyof T) |((val:T)=>(T[keyof T])|string))=>{
//参数归一化 传入string转为回调函数
if(typeof getByKey === 'string'){
getByKey = (val)=> val[getByKey as keyof T]
}
if(!( getByKey instanceof Function)) throw new Error('请传入合法参数(string 或者 function )!');
const result:{
[key:string]:T[]
} = {}
for (let val of list){
const key = getByKey(val) + '';
if(result[key]) {
result[key].push(val)
}else{
result[key] =[val]
}
}
return result;
}
类型提示效果
现在我们可以通过传入回调函数实现自定义分组的key
到这里为止,一个具备类型标注的分组函数就完成了;
但是!上面似乎只能根据属性值或属性值的拼接完成分组,在实际情况中往往会有根据某个属性值的范围进行分组; 例如:年龄根据 小于18 18-29 30-50 这种范围分组,这时候上面的函数其实同样可以满足我们的需求; 只需在回调函数中这样写
groupBy(list,(val)=>{
if(val.age<18) return '少年'
if(val.age<30) return '青年'
if(val.age<50) return '中年'
return '老年'
})