对第二个属性可能不存在的数组进行排序

时间:2018-08-28 21:51:07

标签: arrays angular typescript object

我需要对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属性外,但我想不出一种更干净的方法。

有更好的方法吗?

1 个答案:

答案 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;
    }
});