根据typescript中的属性对对象数组进行排序

时间:2018-03-01 11:40:28

标签: sorting typescript

我在表格中显示一个包含'request'类型项的数组。我想对表的列进行排序,因此我计划为每个列标题创建一个click方法。此方法根据该列中显示的属性值对数组进行排序。

public sortProduct(): void {

    this.requests.sort((a, b) => {
        if (a.productName < b.productName)
            return -1;
        if (a.productName > b.productName)
            return 1;
        return 0;
    });

    if (!this.productSortOrder) {
        this.requests.reverse();
        this.productSortOrder = true;
    } else {
        this.productSortOrder = false;
    }        
}   

这有效,但现在我需要为每一列创建一个方法。我正在寻找一种方法来调用这样的排序方法:

this.requests.sortMethod(property, order);

然后,此方法将根据数组中对象的属性和给定的排序顺序对请求数组进行排序。 我怎样才能做到这一点?我想我正在寻找像Func&lt;&gt;这样的东西在C#。

2 个答案:

答案 0 :(得分:3)

您可以使用功能签名获得与Func

类似的效果
sortProduct<T>(prop: (c: Product) => T, order: "ASC" | "DESC"): void {
    this.requests.sort((a, b) => {
        if (prop(a) < prop(b))
            return -1;
        if (prop(a) > prop(b))
            return 1;
        return 0;
    });

    if (order === "DESC") {
        this.requests.reverse();
        this.productSortOrder = true;
    } else {
        this.productSortOrder = false;
    }        
}
// Usage
sortProduct(p=> p.productName, "ASC");

或者您可以使用属性名称(keyof Product将确保字符串必须是Product的属性):

sortProduct<T>(propName: keyof Product, order: "ASC" | "DESC"): void {
    this.requests.sort((a, b) => {
        if (a[propName] < b[propName])
            return -1;
        if (a[propName] > b[propName])
            return 1;
        return 0;
    });
    ...
} 
// Usage
sortProduct("productName", "ASC");
sortProduct("productName_", "ASC"); // Error

答案 1 :(得分:0)

您可以将SortUtil类与静态模板方法sortByProperty结合使用:

    double X = (finalTemp/initialTemp);
    double A = Math.pow(X, (k/n));
    double tk = initialTemp * A;