如何将数组所有元素转为独立字符串并判断数组包含关系?
解决思路与代码优化
先明确核心需求:从items里提取所有带weapon标签的物品ID,再检查挑战者/对手的物品列表(challengerItems/opposerItems的键)是否包含至少一个这些武器ID,以此判断他们是否持有可用于决斗的武器。
简化现有代码
你之前的v、results、va可以合并为一步,直接拿到所有武器ID的字符串数组(Object.keys返回的是字符串,确保类型匹配能避免判断出错):
// 提取所有带weapon标签的物品ID,统一转成字符串 const weaponIds = items .filter(item => item.tags.includes('weapon')) .map(item => String(item.id));
核心判断逻辑:检查数组是否存在交集
要判断用户的物品列表是否包含任意武器ID,用some()方法最直接——只要有一个武器ID在用户的物品键数组里,就返回true。如果数组数据量较大,用Set可以大幅优化查找性能:
方法1:直接用数组方法(适合小数据量)
替换你代码里的CHECK IF USER HAS ANY WEAPONS和CHECK IF OTHER USER HAS ANY WEAPONS:
// 检查挑战者是否持有武器 if (!weaponIds.some(id => c.includes(id))) { return message.reply(`\`❓\` <@${message.author.id}> 没有武器!决斗取消!`); } // 检查对手是否持有武器 if (!weaponIds.some(id => o.includes(id))) { return message.reply(`\`❓\` <@${opposer.id}> 没有武器!决斗取消!`); }
方法2:用Set优化性能(适合大数据量)
把用户的物品键转成Set,查找速度从数组的O(n)降到O(1):
const challengerItemSet = new Set(c); const opposerItemSet = new Set(o); if (!weaponIds.some(id => challengerItemSet.has(id))) { return message.reply(`\`❓\` <@${message.author.id}> 没有武器!决斗取消!`); } if (!weaponIds.some(id => opposerItemSet.has(id))) { return message.reply(`\`❓\` <@${opposer.id}> 没有武器!决斗取消!`); }
完整优化后的代码
整合所有逻辑,同时增加容错处理避免报错:
// 提取所有武器ID并转成字符串 const weaponIds = items .filter(item => item.tags.includes('weapon')) .map(item => String(item.id)); // 获取双方的物品键数组,加||{}避免对象为undefined时报错 const c = Object.keys(challengerItems || {}); const o = Object.keys(opposerItems || {}); // 先判断物品对象是否存在或为空 if (!challengerItems || c.length === 0) { return message.reply(`\`❓\` <@${message.author.id}> 没有武器!决斗取消!`); } if (!opposerItems || o.length === 0) { return message.reply(`\`❓\` <@${opposer.id}> 没有武器!决斗取消!`); } // 检查是否持有有效武器 const challengerItemSet = new Set(c); const opposerItemSet = new Set(o); if (!weaponIds.some(id => challengerItemSet.has(id))) { return message.reply(`\`❓\` <@${message.author.id}> 没有武器!决斗取消!`); } if (!weaponIds.some(id => opposerItemSet.has(id))) { return message.reply(`\`❓\` <@${opposer.id}> 没有武器!决斗取消!`); }
补充说明:
- 加
|| {}是为了防止challengerItems/opposerItems为undefined时,Object.keys抛出错误; - 转
String(item.id)是确保武器ID和物品键的类型一致,避免数字ID与字符串键因类型不匹配导致判断失败; - 数据量较大时,Set的查找性能远优于数组
includes。
内容的提问来源于stack exchange,提问作者Slimey
相关产品推荐
相关产品推荐

