JavaScript去标点函数问题:firstIndex变量无法循环递增修复求助
问题修复:移除标点符号的JavaScript函数
问题根源
你代码里的firstIndex是在for...in循环内部声明的,每次循环都会把它重置为0。哪怕某次循环里你把它加到1,下一轮循环一开始又变回0了,所以永远只能往tempArray[0]和tempArray[1]塞值,后面符合条件的字符根本存不进去。
修复方案1:把firstIndex移到循环外
把var firstIndex = 0;放到for循环外面,这样它的值在循环迭代中会持续累加:
const textInput = "Hello world!" const insensitiveText = textInput.toLocaleLowerCase(); const letters = insensitiveText.split(""); const removePunctuation = (letters) =>{ const tempArray = new Array(); var firstIndex = 0; // 移到循环外部 for( const i in letters){ if(letters[i].charCodeAt() > 96 && letters[i].charCodeAt() < 123){ tempArray[firstIndex] = letters[i]; firstIndex++; // 用自增运算符简化写法 } } return tempArray; }
更简洁的优化方案:用数组push方法
其实根本不用手动维护索引,直接用数组的push()方法,符合条件的字符直接推到数组里就行,代码更简洁不易出错:
const textInput = "Hello world!" const insensitiveText = textInput.toLocaleLowerCase(); const letters = insensitiveText.split(""); const removePunctuation = (letters) =>{ const tempArray = []; // 用数组字面量创建更常用 for( const char of letters){ // 遍历数组用for...of比for...in更合适 if(char.charCodeAt() > 96 && char.charCodeAt() < 123){ tempArray.push(char); } } return tempArray; }
额外优化:用正则表达式一行搞定
如果只是移除非小写字母(你已经把输入转成了小写),可以直接用正则替换,代码更短:
const textInput = "Hello world!"; // 返回处理后的字符数组 const removePunctuation = (text) => text.toLowerCase().replace(/[^a-z]/g, '').split(''); // 如果只需要返回字符串,连split都可以省略: // const removePunctuation = (text) => text.toLowerCase().replace(/[^a-z]/g, '');
内容的提问来源于stack exchange,提问作者Thành Hoàng
相关产品推荐
相关产品推荐

