JavaScript:不使用正则表达式从字符数组提取有效字符
编程训练营挑战卡壳求助
正在为加入编程训练营完成多项编程挑战,却因同一个问题卡壳数日。查阅资料、尝试多种方案后,仍无法通过平台控制台的测试。
题目要求
创建名为extractPassword的函数,接收含无效字符的字符数组,返回仅包含有效字符(a-z、A-Z、0-9)的字符串。示例如下:
extractPassword(['a', '-', '~', '1', 'a', '/']); // 应返回字符串'a1a' extractPassword(['~', 'A', '7', '/', 'C']); // 应返回字符串'A7C'
尝试的解决方案
尝试1:正则表达式方案
首先使用正则表达式实现:
var newArray = []; var extractPassword = function(arr){ console.log('arr: ' + arr); return arr.join('').match(/[a-zA-Z0-9]/g); }; console.log(extractPassword(['a','-','~','1','a','/']).toString().replace(/,/g, ''));
本地得到预期结果'a1a',但平台报错:
Code is incorrect RegExs are cool, but that is not the type of solution we are looking for.
尝试2:for循环+条件判断
接着尝试结合函数、for循环与if语句:
var newArray = []; extractPassword(['a','-', '~', '1', 'a', '/']); function extractPassword(arr){ console.log('arr: ' + arr); var arrayToString = arr.join(''); console.log('arrayToString: ' + arrayToString); for (var i = 0; i < arrayToString.length; i++){ var charCode = arrayToString.charCodeAt(i); console.log('charCode ' + i + ':' + charCode); if((charCode > 47 && charCode < 58) || (charCode > 64 && charCode < 91) || (charCode > 96 && charCode < 123)){ newArray.push(arr[i]); console.log('newArray: ' + newArray); } } console.log('Final string: ' + newArray.join('')); }
本地得到结果'a1a',但平台仍报错:
Code is incorrect. Your function is not returning the correct value.
正确解决方案
你的第二种尝试思路是对的,但存在两个关键问题:
- 全局变量污染:
newArray是全局变量,多次调用函数时会累积之前的结果,导致后续测试用例出错 - 缺少返回值:函数仅在控制台打印结果,没有通过
return语句返回最终字符串,平台测试无法获取正确结果
修正后的代码如下:
function extractPassword(arr) { // 在函数内部声明结果数组,避免全局污染 const validChars = []; // 直接遍历输入数组的每个元素 for (let i = 0; i < arr.length; i++) { const char = arr[i]; const charCode = char.charCodeAt(0); // 判断字符是否为有效类型:数字(0-9)、大写字母(A-Z)、小写字母(a-z) if ( (charCode >= 48 && charCode <= 57) || (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) ) { validChars.push(char); } } // 返回拼接后的字符串 return validChars.join(''); } // 验证测试用例 console.log(extractPassword(['a', '-', '~', '1', 'a', '/'])); // 输出 'a1a' console.log(extractPassword(['~', 'A', '7', '/', 'C'])); // 输出 'A7C'
也可以用更简洁的for...of循环实现:
function extractPassword(arr) { const validChars = []; for (const char of arr) { const charCode = char.charCodeAt(0); if ( (charCode >= 48 && charCode <= 57) || (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) ) { validChars.push(char); } } return validChars.join(''); }
内容的提问来源于stack exchange,提问作者JRPCRD
相关产品推荐
相关产品推荐

