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