带有多个属性的对象的打字稿排序数组

Posted

技术标签:

【中文标题】带有多个属性的对象的打字稿排序数组【英文标题】:Typescript sorting array with objects on multiple properties 【发布时间】:2016-05-18 01:20:46 【问题描述】:

我喜欢用具有多个属性的对象对数组进行排序。我的对象有一个名为 name 的字符串和一个名为强制的布尔值。

首先我要按年龄排序,然后按姓名排序。

我该怎么做?

按年龄排序很容易...:

this.model.mylist.sort((obj1: IObj, obj2: IObj => 
    if (obj1.age < obj2.age) 
        return -1;
    
    if (obj1.age > obj2.age) 
        return 1;
    
    return 0;
);

【问题讨论】:

你的问题解决了吗? 【参考方案1】:

这样的事情应该可以工作。该方法比较当前值和下一个值,并在两个年龄值相同的情况下添加比较。然后根据年龄按顺序假设列名。

private compareTo(val1, val2, typeField) 
    let result = 0;
    if (typeField == "ftDate") 
        result = val1 - val2;
     else 
        if (val1 < val2) 
            result = - 1;
         else if (val1 > val2) 
            result = 1;
         else 
            result = 0;
        
    

    return result;

-

this.model.mylist.sort((a, b) => 
    let cols = ["age", "name"];

    let i = 0, result = 0, resultordem = 0;

    while (result === 0 && i < cols.length) 
        let col = cols[i];
        let valcol1 = a[col];
        let valcol2 = b[col];
        let typeField = "string";

        if (col == "age") 
            typeField = "number";
        

        if (valcol1 != "null" && valcol1 != "null") 
            resultordem = this.compareTo(valcol1, valcol2, typeField);

            if (resultordem != 0) 
                break;
            
        
        i++;
    
    return resultordem;
);

【讨论】:

你能解释一下你的答案吗? 很简单,该方法比较当前值和下一个值,并在两个年龄值相同的情况下添加比较。然后根据年龄按顺序假设列名。 请将此解释添加到您的答案中。【参考方案2】:

好吧,您只在两个年龄值相同的情况下添加比较。所以这样的事情应该可以工作:

this.model.mylist.sort((obj1: IObj, obj2: IObj) => 
    if (obj1.age < obj2.age) 
        return -1;
    
    if (obj1.age > obj2.age) 
        return 1;
    

    return obj1.name.localeCompare(obj2.name);
);

【讨论】:

以上是关于带有多个属性的对象的打字稿排序数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有嵌套数组的 JSON 对象映射到打字稿模型中?

使用随机排序顺序的打字稿数组排序

带有动态键的打字稿通用函数

如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?

解决打字稿错误的最佳方法 - 类型上不存在属性

接受通用参数和字符串数组的打字稿函数