const people: obj[] = [
{
name: 's1',
age: 18,
sex: 'male'
},
{
name: 's2',
age: 19,
sex: 'male'
},
{
name: 's3',
age: 20,
sex: 'female'
},
{
name: 's4',
age: 21,
sex: 'male'
},
{
name: 's5',
age: 22,
sex: 'female'
},
]
interface obj {
name: string,
sex: string,
age: number
}
// 普通函数封装
const groupBy2 = (arr: Array<obj>, name: string) => {
const result = {} as any
// forEach 和 for 都可以,个人习惯
arr.forEach((item: any) => {
const key = item[name]
if (result[key]) {
result[key].push(item)
} else {
result[key] = [item]
}
})
return result
}
// 调用时传入对应的数组和对象需要分组的字段
console.log(groupBy2(people,'sex'))
// 公共函数封装
const groupBy = (arr: Array<obj>, generateKey: any) => {
if (typeof generateKey == 'string') {
const generateName = generateKey
generateKey = (item: any) => item[generateName]
}
const result = {} as any
arr.forEach((item: obj, index: number) => {
const key = generateKey(item, index, arr)
if (result[key]) {
result[key].push(item)
} else {
result[key] = [item]
}
})
return result
}
// 调用是传入对应的数组和对象的方法(可以按自己需要的格式),也可以只传对应的字段
const res = groupBy(people, (i: any) => (i.age % 2 == 0 ? `奇数` : `偶数`))
const res2 = groupBy(people, (i: any) => `${i.sex}`)
const res3 = groupBy(people, 'sex')
函数的封装
于 2024-03-30 11:29:22 首次发布