JavaScript - 如何按在线人员对数组中的对象进行排序,然后按他的排名权限排序,然后按名称的字母顺序排序?



Heyo,我正在尝试用JSON为朋友渲染REST API。我已经在一个数组中拥有来自数据库的朋友,但我需要对它们进行排序以获得更好的意义。例如,数组如下所示:

const friends = [
{
"id": 1,
"name": "Hellbyte",
"rank": "founder",
"online": true
},
{
"id": 3,
"name": "Tess",
"rank": "user",
"online": false
},
{
"id": 9,
"name": "Katey",
"rank": "admin",
"online": true
},
{
"id": 5,
"name": "John",
"rank": "globalmoderator",
"online": false
},
{
"id": 10,
"name": "Andre",
"rank": "admin",
"online": true
},
{
"id": 19,
"name": "Xyz",
"rank": "user",
"online": true
},
{
"id": 17,
"name": "Nate",
"rank": "premium",
"online": false
},
{
"id": 25,
"name": "Berry",
"rank": "premium",
"online": false
}
]

我需要按以下条件对它们进行排序:

  • 在线是真的
    • 排名按此顺序排列:创始人、管理员、全球版主、高级、用户
    • 按姓名字母顺序排列
  • 在线是假的
    • 排名按此顺序排列:创始人、管理员、全球版主、高级、用户
    • 按姓名字母顺序排列

现在它应该看起来像:

const friends = [
{
"id": 1,
"name": "Hellbyte",
"rank": "founder",
"online": true
},
{
"id": 10,
"name": "Andre",
"rank": "admin",
"online": true
},
{
"id": 9,
"name": "Katey",
"rank": "admin",
"online": true
},
{
"id": 19,
"name": "Xyz",
"rank": "user",
"online": true
},
{
"id": 5,
"name": "John",
"rank": "globalmoderator",
"online": false
},
{
"id": 25,
"name": "Berry",
"rank": "premium",
"online": false
},
{
"id": 17,
"name": "Nate",
"rank": "premium",
"online": false
},
{
"id": 3,
"name": "Tess",
"rank": "user",
"online": false
}
]

我怎么能这样排序?请让我知道该怎么做。谢谢。

您可以使用array#sort并通过自定义比较器来比较friend,基于online状态,然后是rank顺序,最后是按词典顺序比较name

const friends = [ { "id": 1, "name": "Hellbyte", "rank": "founder", "online": true }, { "id": 3, "name": "Tess", "rank": "user", "online": false }, { "id": 9, "name": "Katey", "rank": "admin", "online": true }, { "id": 5, "name": "John", "rank": "globalmoderator", "online": false }, { "id": 10, "name": "Andre", "rank": "admin", "online": true }, { "id": 19, "name": "Xyz", "rank": "user", "online": true }, { "id": 17, "name": "Nate", "rank": "premium", "online": false }, { "id": 25, "name": "Berry", "rank": "premium", "online": false } ],
ranks = ["founder", "admin", "globalmoderator", "premium", "user"];
friends.sort((a,b) => b.online - a.online || ranks.indexOf(a.rank) - ranks.indexOf(b.rank) || a.name.localeCompare(b.name));
console.log(friends);

您可以为各种在线状态和排名获取一个对象作为顺序,并首先按online排序,然后按rank排序,最后按name排序。

这种方法允许对排名有不同的排序顺序,而与在线状态无关。

var rank = { true: { founder: 1, admin: 2, globalmoderator: 3, premium: 4, user: 5 }, false: { founder: 1, admin: 2, globalmoderator: 3, premium: 4, user: 5 } },
data = [{ id: 1, name: "Hellbyte", rank: "founder", online: true }, { id: 3, name: "Tess", rank: "user", online: false }, { id: 9, name: "Katey", rank: "admin", online: true }, { id: 5, name: "John", rank: "globalmoderator", online: false }, { id: 10, name: "Andre", rank: "admin", online: true }, { id: 19, name: "Xyz", rank: "user", online: true }, { id: 17, name: "Nate", rank: "premium", online: false }, { id: 25, name: "Berry", rank: "premium", online: false }];
data.sort((a, b) =>
b.online - a.online ||
rank[a.online][a.rank] - rank[b.online][b.rank] ||
a.name.localeCompare(b.name)
);
console.log(data)
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新