我需要对Angular项目的表进行排序。问题在于,对于表中的某些值,我需要按数组中对象的直接属性进行排序,而对于其他值,我需要按该直接属性的子项进行排序。
例如,我有associate.lastname
代表一列,associate.client.name
代表另一列。我正在尝试用一种方法来完成所有这些工作,并且在TypeScript中有一种有效的方法。
这是组件类中的sortBy
方法:
sortBy(option: SortOption, sortedBy: string) {
const props = option.split('.');
const parent = props[0];
const child = props[1];
const asc = this[sortedBy];
if(!child) {
this.associates.sort((associateA, associateB)=> {
if (associateA[parent] < associateB[parent]) {
return asc === true ? -1 : 1;
} else if (associateB[parent] < associateA[parent]) {
return asc === true ? 1 : -1;
} else {
return 0;
}
});
} else {
this.associates.sort((associateA, associateB)=> {
if (associateA[parent][child] < associateB[parent][child]) {
return asc === true ? -1 : 1;
} else if (associateB[parent][child] < associateA[parent][child]) {
return asc === true ? 1 : -1;
} else {
return 0;
}
});
}
this[sortedBy] = !this[sortedBy]
}
SortOption
是一个枚举,并且值中可以包含或可以不包含.
。我在该时间段上进行拆分以获得父级和子级属性,然后根据父级或子级是否存在对数组进行排序。
现在我想知道的是,是否有更好,更干燥的方法来做到这一点。您会注意到,if和else语句中的代码几乎完全相同,除了是否使用child属性外,但我想不出一种更干净的方法。
有更好的方法吗?
答案 0 :(得分:0)
您可能希望提取排序键功能:
let sortingKey: (associate: any) => number; // or some other type, depends on your code
if (child) {
sortingKey = (associate) => associate[parent][child];
} else {
sortingKey = (associate) => associate[parent];
}
之后,您将可以简单地编写:
this.associates.sort((associateA, associateB)=> {
if (sortingKey(associateA) < sortingKey(associateB)) {
return asc === true ? -1 : 1;
} else if (sortingKey(associateB) < sortingKey(associateA)) {
return asc === true ? 1 : -1;
} else {
return 0;
}
});