如何正确实现removeVowelKeys函数:过滤非元音开头的字符串数组
修正后的removeVowelKeys函数实现
你的代码存在几个关键问题,直接导致结果不符合预期:
- 循环边界错误:
i<=keys.length会让循环多执行一次,访问keys[keys.length](数组越界,值为undefined),应该改成i < keys.length。 - 判断逻辑错误:用
||连接不等于判断永远为true(一个字符不可能同时等于所有元音),而且完全没处理大写元音的情况,比如'Advice'这类以大写元音开头的字符串根本没被过滤。
下面是修正后的代码,同时优化了逻辑,让代码更简洁易读:
function removeVowelKeys(keys) { // 定义大小写不敏感的元音集合,转成小写统一判断 const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'y']); return keys.filter(key => { // 取首字符转小写,判断是否不在元音集合中 const firstChar = key[0].toLowerCase(); return !vowels.has(firstChar); }); } // 测试示例 console.log(removeVowelKeys(['alarm', 'chip', 'isValid', 'Advice', 'onClick'])); // ['chip']
如果坚持用for循环的写法,修正后的版本如下:
function removeVowelKeys(keys) { let result = []; const vowels = {'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}; for (let i = 0; i < keys.length; i++) { const firstChar = keys[i][0].toLowerCase(); // 判断首字符转小写后不在元音对象中 if (!vowels[firstChar]) { result.push(keys[i]); } } return result; }
核心改进点:
- 统一将首字符转为小写,解决大小写不敏感的问题
- 用集合/对象存储元音,判断逻辑更清晰高效
- 修正循环边界,避免数组越界
- 调整判断逻辑,确保只有不以元音开头的字符串才被保留
内容的提问来源于stack exchange,提问作者Vyper
相关产品推荐
相关产品推荐

