You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

正确解决方案

你的第二种尝试思路是对的,但存在两个关键问题:

  1. 全局变量污染:newArray是全局变量,多次调用函数时会累积之前的结果,导致后续测试用例出错
  2. 缺少返回值:函数仅在控制台打印结果,没有通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:45:47