为何这段switch语句无法替换字符串字符以完成JS HTML实体转换算法?
为什么我的HTML实体转换代码无法正常工作?
我来帮你拆解一下代码里的几个关键问题,正是这些问题导致替换功能完全失效:
1. Switch Case 匹配目标搞反了
你写的switch case里判断的是已经转义后的HTML实体(比如&、<),但你的需求是把原始的特殊字符(&、<、>、"、')转换成实体。举个例子,当输入字符串里的字符是&时,你的case根本不会命中——因为你写的是case '&':,这和原始字符完全不匹配。
2. replace方法的使用误区
JavaScript的replace方法是返回新字符串,不会修改原有的字符串。你写的item.replace(item, tempArr[0])只是执行了替换操作,但没有把结果存到任何变量里,所以原item完全没变,最后push到数组里的还是原来的字符。
3. 正则表达式完全不符合需求
你的正则/[&<>"']/是一个字符集,它会匹配&、a、m、p、;、l、t这些单个字符,而不是你想要匹配的特殊字符。实际上你甚至不需要这个正则,因为switch已经可以处理所有目标字符了。
4. 多余的tempArr变量
用一个数组的第一个元素来存转换后的实体完全没必要,直接在case里给一个临时变量赋值就好,徒增代码复杂度。
修正后的代码示例
这里给你调整后的版本,解决了所有问题:
function convertHTML(str) { let newArr = []; str.split('').forEach((item) => { let converted = item; // 默认保留原字符 switch(item) { case '&': converted = '&'; break; case '<': converted = '<'; break; case '>': converted = '>'; break; case '"': converted = '"'; break; case "'": converted = '''; break; // 其他字符保持不变 } newArr.push(converted); }); return newArr.join(''); // 最后要把数组合并成字符串返回 } console.log(convertHTML("Dolce & Gabbana")); // 输出 "Dolce & Gabbana" console.log(convertHTML("Hamburger < Pizza > Tacos")); // 输出 "Hamburger < Pizza > Tacos"
另外,还有更简洁的写法,用对象映射替代switch,代码会更清爽:
function convertHTML(str) { const entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return str.split('').map(char => entityMap[char] || char).join(''); }
内容的提问来源于stack exchange,提问作者AndrewNeedsHelp
相关产品推荐
相关产品推荐

