z-utils-ts
Version:
使用TypeScript编写的工具函数库
68 lines (57 loc) • 2 kB
text/typescript
// 重载1: 按对象属性分组
function groupBy<T, K extends keyof T>(
array: T[],
key: K
): T[K] extends keyof any ? Record<T[K] & keyof any, T[]> : never;
// 重载2: 按函数返回值分组
function groupBy<T, K extends keyof any>(
array: T[],
fn: (item: T) => K
): Record<K, T[]>;
// 实现
function groupBy<T, K extends keyof any>(
array: T[],
keyOrFn: K | ((item: T) => K)
): Record<K, T[]> {
return array.reduce((result, item) => {
// 确定分组键
const key =
typeof keyOrFn === "function" ? keyOrFn(item) : (item as any)[keyOrFn];
// 如果该分组不存在,则初始化一个空数组
if (!result[key]) {
result[key] = [];
}
// 将当前项添加到对应的分组中
result[key].push(item);
return result;
}, {} as Record<K, T[]>);
}
// 示例用法
// 1. 定义一个接口用于测试
interface Person {
name: string;
age: number;
gender: "male" | "female";
department: string;
}
// 2. 创建测试数据
const people: Person[] = [
{ name: "Alice", age: 25, gender: "female", department: "engineering" },
{ name: "Bob", age: 30, gender: "male", department: "marketing" },
{ name: "Charlie", age: 35, gender: "male", department: "engineering" },
{ name: "Diana", age: 28, gender: "female", department: "marketing" },
{ name: "Eve", age: 40, gender: "female", department: "engineering" },
];
// 3. 按属性分组 - 按部门分组
const groupedByDepartment = groupBy(people, "department");
console.log("按部门分组:", groupedByDepartment);
// 4. 按函数结果分组 - 按年龄段分组
const groupedByAgeRange = groupBy(people, (person) => {
if (person.age < 30) return "young";
if (person.age < 40) return "middle";
return "senior";
});
console.log("按年龄段分组:", groupedByAgeRange);
// 5. 按性别分组
const groupedByGender = groupBy(people, "gender");
console.log("按性别分组:", groupedByGender);