【问题标题】:Sorting objects based on a string value property in TypeScript基于 TypeScript 中的字符串值属性对对象进行排序
【发布时间】:2017-09-19 18:14:38
【问题描述】:

我有一个对象数组,对象的定义如下所示:

export class AccountInfo {
  accountUid: string;
  userType: string;
  firstName: string;
  middleName: string;
  lastName: string;
}

注意:我没有 userType 作为枚举的原因是因为该对象是由数据库调用填充的,我无法找到一种干净的方法来让从数据库返回的字符串填充枚举.

我想对数组进行排序,以便首先出现 userType 为“STAFF”的对象,然后是“TEACHER”,然后是“PARENT”,然后是“STUDENT”。

【问题讨论】:

    标签: javascript node.js typescript enums


    【解决方案1】:

    您可以将订单存储在array 中,然后只需使用indexOfsort 即可实现您的目标。请看下面的代码示例:

    const humans = [{
      accountUid: "1",
      userType: "TEACHER",
    }, {
      accountUid: "2",
      userType: "STAFF",
    }, {
      accountUid: "3",
      userType: "STUDENT",
    }, {
      accountUid: "4",
      userType: "PARENT",
    }];
    
    const order = ['STAFF', 'TEACHER', 'PARENT', 'STUDENT'];
    
    const result = humans.sort((a, b) => order.indexOf(a.userType) - order.indexOf(b.userType));
    
    console.log(result)

    如果你不能使用 ES6,就使用:

    humans.sort(function(a, b){
        return order.indexOf(a.userType) - order.indexOf(b.userType);
    });
    

    【讨论】:

    • 优雅的方式。
    • 这正是我想要的,谢谢!我注意到最初对这个问题的一些其他回答不太优雅,但在看到这个解决方案后,他们一定已经删除了他们的帖子。无论哪种方式,这不仅是一个很好且有效的解决方案,而且由于使用了模拟数据,您的答案非常彻底。先生/女士的道具!
    • 对我不起作用。它说布尔值不能转换为数字。
    【解决方案2】:

    这是另一种方法,可能有一个订单对象来存储订单

    const actionOrder = {
        "EAT" : 1,
        "SLEEP" : 2,
        "PLAY" : 3,
    } as const;
    
    const users = [{
        name: "Mike",
        action: "PLAY"
    }, {
        name: "John",
        action: "EAT"
    }, {
        name: "Harry",
        action: "SLEEP"
    }
    ];
    
    users.sort((a,b) => {
        return actionOrder[a.action] - actionOrder[b.action];
    });
    
    console.log(users);
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 1970-01-01
      • 2021-06-27
      相关资源
      最近更新 更多