设计思路
- 定义可扩展接口:使用
interface
定义对象结构,为了实现可扩展性,可以在接口中使用索引签名 [key: string]: any
,这样在不同场景下可以添加额外字段。
- 编写泛型函数:函数接受一个对象数组和用于排序的字段名作为参数。通过
T
泛型来表示对象的类型,使得函数可以处理不同结构的对象数组。
- 处理不同类型排序字段:在函数内部,根据字段值的类型(字符串或数字)进行不同方式的排序。对于字符串,使用
localeCompare
方法;对于数字,直接比较大小。
代码实现
interface ExtensibleObject {
[key: string]: any;
}
function sortByField<T extends ExtensibleObject>(array: T[], field: keyof T): T[] {
return array.sort((a, b) => {
const valueA = a[field];
const valueB = b[field];
if (typeof valueA ==='string' && typeof valueB ==='string') {
return valueA.localeCompare(valueB);
} else if (typeof valueA === 'number' && typeof valueB === 'number') {
return valueA - valueB;
} else {
return 0;
}
});
}
// 示例用法
interface User {
name: string;
age: number;
}
const users: User[] = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 20 },
{ name: 'Charlie', age: 30 }
];
const sortedByName = sortByField(users, 'name');
const sortedByAge = sortByField(users, 'age');
console.log(sortedByName);
console.log(sortedByAge);