【问题标题】:Javascript - sort array of strings in a custom wayJavascript - 以自定义方式对字符串数组进行排序
【发布时间】:2017-08-24 17:30:48
【问题描述】:

我有一个字符串数组:

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"}];

数组项的顺序并不总是相同的。 我想对该数组进行排序,使其如下所示:守门员、边后卫、中后卫、中场、边锋、前锋。 我正在考虑枚举,但我不知道如何在这种情况下使用它们。

【问题讨论】:

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

标签: javascript arrays sorting


【解决方案1】:

您可以取一个对象作为排序顺序,然后按差异排序。

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);

【讨论】:

  • 如果他可以手动定义一个对象的顺序,他可以改变数组本身:D 无论如何都是好的。投赞成票。
  • 我认为它只是一个简化的数组,供以后在对象中使用更多数据。
  • 是的。可以想到那个案例。
  • 是否可以在具有“位置”属性的对象数组上使用该逻辑?
  • @user7479651,可以使用return order[a.position] - order[b.position];
【解决方案2】:

给你。您应该使用这种方法。 您需要创建一个排名图,然后按该图排序。

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);

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 2011-11-12
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多