优雅的写一个分组函数-groupBy

166 阅读1分钟

本次函数实现使用了参数归一化、泛型知识

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;
} 

类型提示效果

image.png

image.png

现在我们可以通过传入回调函数实现自定义分组的key

image.png

到这里为止,一个具备类型标注的分组函数就完成了;

但是!上面似乎只能根据属性值或属性值的拼接完成分组,在实际情况中往往会有根据某个属性值的范围进行分组; 例如:年龄根据 小于18 18-29 30-50 这种范围分组,这时候上面的函数其实同样可以满足我们的需求; 只需在回调函数中这样写

groupBy(list,(val)=>{
  if(val.age<18) return '少年'
  if(val.age<30) return '青年'
  if(val.age<50) return '中年'
  return '老年'
})