javascript - Discord.js 角色检查优化
问题描述
我目前正在构建一个不和谐验证机器人,该机器人的功能之一是检查您是否从每个所需类别中拥有 1 个角色,然后在最后生成您的角色摘要。目前我有一个工作解决方案,它的功能也完全符合我的要求,但它使用了大量的 if 堆栈,我对 js 很陌生,但被告知不要使用大的 if/if else if 堆栈。我已经研究过开关案例,但无法真正看到我将如何在这里应用它们,所以我想知道是否有更优化的方式来实现我所需要的。我目前的代码如下:
var hasrole = false;
var role = "";
var subrole = "";
var istype1 = false;
var istype2 = false;
var istype3 = false;
var istype4 = false;
var counter = 0;
if (message.member.roles.cache.find(r => r.id === "736032207248031765")) {
istype1 = true;
role = "Type 1";
hasrole = true;
counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736032822053175306")) {
istype2 = true;
role = "Type 2";
hasrole = true;
counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736032670013980702")) {
role = "Type 3";
hasrole = true;
counter++
if (message.member.roles.cache.find(r => r.id === "736032716411371581")) {
istype1 = true;
subrole = "Type 1";
} else if (message.member.roles.cache.find(r => r.id === "736032780122849340") {
istype2 = true;
subrole = "Type 2";
} else {
istype3 = true;
}
}
if (message.member.roles.cache.find(r => r.id === "736032870703038534")) {
istype4 = true;
role = "Type 4";
hasrole = true;
counter ++;
}
if (message.member.roles.cache.find(r => r.id === "736033471474172025")) {
istype2 = true;
role = "Type 5";
hasrole = true;
counter ++;
}
if (counter >= 1) {
message.channel.send("More than 1 main role, please have only 1");
return;
} else if (hasrole == false) {
message.channel.send("No main role please get one")
return;
}
解决方案
好的,所以我假设您的代码工作正常,只需要一点优化。
我的 #1 建议是您使用数组并迭代您的类型。
我的 #2 建议是不要硬编码您的角色 ID。
我的#3 建议是通读您的代码并尝试理解它,因为它现在看起来很混乱。
您在类型 3 角色检查中的代码令人困惑,并且您的类型 5 角色检查验证了角色 2 值。
这是我的代码版本
const roles = ['736032207248031765', '736032822053175306', '736032670013980702', '736032870703038534', '736033471474172025'];
let userRoles = [];
roles.forEach(r => {
if(message.member.roles.cache.has(r)){
userRoles.push(r);
}
});
if (userRoles.length >= 1) {
message.channel.send("More than 1 main role, please have only 1");
return;
} else if (userRoles.length == 0) {
message.channel.send("No main role please get one")
return;
}
如您所见,这比整个 ifs 链方便得多。
推荐阅读
- javascript - 有没有办法查询 Firestore 集合的特定中间部分?
- c# - ASP.NET GridView 编辑、更新、删除命令在 Chrome 版本 83 中被破坏
- flutter - 如何让用户始终登录
- angular - 角度拖放 - 无法将项目拖放到目标位置
- javascript - 如何在 React Shadow Root 中应用样式?
- amazon-web-services - Gatsby 站点在 EC2 上使用 pm2 节点和 aws 经典负载均衡器服务需要 https
- emacs - 如何自动在所有 clojure、closurescript 和 elisp 缓冲区上自动启用 paredit 模式?
- reactjs - React 组件无限重新渲染,在 useEffect 挂钩中设置相同的布尔值状态?
- java - 占位符 Spring Boot 中的映射
- spring - Spring Boot中的InternalViewResolver无法找到视图