Javascript - 按自定义方式排序字符串数组

5

我有一个字符串数组:

var players = [{Name: player1name, Surname: player1surname, Position: "Centre back"}, {Name: player2name, Surname: player2surname, Position: "Striker"}, {Name: player3name, Surname: player3surname, Position: "Full back"}, {Name: player4name, Surname: player4surname, Position: "Goalkeeper"}, {Name: player5name, Surname: player5surname, Position: "Midfielder"}, {Name: player6name, Surname: player6surname, Position: "Winger"}];

数组项的顺序并不总是相同的。 我希望将该数组排序,使其按照以下顺序排列:守门员、后卫、中后卫、中场球员、边锋、前锋。 我考虑使用枚举,但不知道如何在这种情况下使用。


2
如果您知道所需的顺序,为什么不按照那个顺序定义数组呢? - trincot
你想要订购哪种逻辑? - Murad Sofiyev
@trincot 我做不到,因为我从数据库中获取特定小组的球员,而当我得到它们时球员并没有排序。每个球员都有一个“位置”属性。 - user7479651
如果您包括玩家的价值,那么这个问题会更有趣,因为现在(只有位置),看起来像是一个不存在的问题。 - trincot
@trincot 我编辑了一个问题。我会在下面尝试回答。如果你有更简单的解决方案,请随意建议。 - user7479651
2个回答

5
您可以使用对象来确定排序顺序,然后按照差异进行排序。

var players = ["Centre back", "Striker", "Full back", "Goalkeeper", "Midfielder", "Winger"],
    order = { Goalkeeper: 1, 'Full back': 2, 'Centre back': 3, Midfielder: 4, Winger: 5, Striker: 6 };
    
players.sort(function (a, b) {
    return order[a] - order[b];
});

console.log(players);


1
如果他可以手动使用对象定义顺序,他就可以直接更改数组本身:D 不管怎样,很棒。点个赞。 - Suresh Atta
1
我认为这只是一个简化的数组,以便在对象中使用更多数据。 - Nina Scholz
是的。可以考虑那种情况。 - Suresh Atta
能否在具有“位置”属性的对象数组上使用该逻辑? - user7479651
@user7479651,使用return order[a.position] - order[b.position];是可行的。 - Nina Scholz
谢谢,我会尝试的。顺便说一下,我已经编辑了一个问题,如果您可以编辑您的答案。 - user7479651

0

好的,你应该使用这种方法。 你需要创建一个排名映射,然后按照该映射进行排序。

let players = [
    {
    "name": "Molla Wague",
    "position": "Centre-Back",
    "jerseyNumber": 13,
    "dateOfBirth": "1991-02-21",
    "nationality": "Mali",
    "contractUntil": "2018-06-30",
    "marketValue": null
    },
    {
    "name": "Heurelho Gomes",
    "position": "Keeper",
    "jerseyNumber": 1,
    "dateOfBirth": "1981-02-15",
    "nationality": "Brazil",
    "contractUntil": "2019-06-30",
    "marketValue": null
    },
    {
    "name": "Christian Kabasele",
    "position": "Centre-Back",
    "jerseyNumber": 27,
    "dateOfBirth": "1991-02-24",
    "nationality": "Belgium",
    "contractUntil": "2021-06-30",
    "marketValue": null
    },
    {
    "name": "José Holebas",
    "position": "Left-Back",
    "jerseyNumber": 25,
    "dateOfBirth": "1984-06-27",
    "nationality": "Greece",
    "contractUntil": "2020-06-30",
    "marketValue": null
    },
    {
    "name": "Daryl Janmaat",
    "position": "Right-Back",
    "jerseyNumber": 2,
    "dateOfBirth": "1989-07-22",
    "nationality": "Netherlands",
    "contractUntil": "2020-06-30",
    "marketValue": null
    },
    {
    "name": "Étienne Capoue",
    "position": "Defensive Midfield",
    "jerseyNumber": 29,
    "dateOfBirth": "1988-07-11",
    "nationality": "France",
    "contractUntil": "2019-06-30",
    "marketValue": null
    },
    {
    "name": "Tom Cleverley",
    "position": "Central Midfield",
    "jerseyNumber": 8,
    "dateOfBirth": "1989-08-12",
    "nationality": "England",
    "contractUntil": "2022-06-30",
    "marketValue": null
    },
    {
    "name": "Roberto Pereyra",
    "position": "Attacking Midfield",
    "jerseyNumber": 37,
    "dateOfBirth": "1991-01-07",
    "nationality": "Argentina",
    "contractUntil": "2021-06-30",
    "marketValue": null
    },
    {
    "name": "Troy Deeney",
    "position": "Centre-Forward",
    "jerseyNumber": 9,
    "dateOfBirth": "1988-06-29",
    "nationality": "England",
    "contractUntil": "2021-06-30",
    "marketValue": null
    }
];
const rankMap = {
 'Keeper': 1,
    'Centre-Back': 2,
    'Right-Back': 3,
    'Left-Back': 4,
    'Defensive Midfield': 5,
    'Central Midfield': 6,
    'Attacking Midfield': 7,
    'Right Wing': 8,
    'Left Wing': 9,
    'Centre-Forward': 10
};

players = players.sort((a, b) => rankMap[a.position] - rankMap[b.position]);

console.log(players);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接