不使用正则实现GUID校验:解决JavaScript Array.every()不符合预期问题
问题根因
你的代码核心问题出在字符串拆分逻辑上:
split()不传入任何参数时,返回的是仅包含完整原字符串的单元素数组,而非你预期的单个字符数组。
比如'abc123'.split()得到的是['abc123'],而非['a','b','c','1','2','3']- 这就导致你调用
every时,实际是把完整字符串传入isValidGUIDChar校验,刚好就出现了你遇到的测试现象:- 传入
'abc':完整字符串匹配"abcdef".includes('abc'),返回true - 传入
'123':完整字符串转数字有效,返回true - 传入
'abc123':既不能转成有效数字,也不在abcdef范围内,返回false
- 传入
修复后的代码
const isValidGUIDChar = (char) => !isNaN(+char) || "abcdef".includes(char.toLowerCase()); let guid = "abc123"; // 先移除所有横杠,再拆分字符校验 const cleanedGuid = guid.replaceAll('-', ''); let isGuidValid = cleanedGuid.length === 32 && cleanedGuid.split('').every(isValidGUIDChar); console.log(isGuidValid);
关键修改点
- 调用
split('')传入空字符串,把处理后的无横杠GUID拆分为单个字符的数组 - 统一先移除所有横杠后再做长度校验和字符校验,避免校验时还要单独处理横杠字符,逻辑更清晰
内容的提问来源于stack exchange,提问作者PakiPat
相关产品推荐
相关产品推荐

