Codewars别名生成函数问题求助:特殊场景测试失败
问题描述
正在解决Codewars上的算法题,需实现aliasGen()函数,接收两个姓名参数,提取首字母匹配给定的firstName和surname对象生成别名。特殊场景要求:
- 任一姓名首字符非A-Z字母时返回指定提示
- 兼容首字母未大写的情况
目前代码卡在特殊场景处理,无法通过部分测试用例,相关代码及失败日志如下:
给定数据示例
var firstName = { A: 'Alpha', B: 'Beta', C: 'Cache', D: 'Data', E: 'Energy', ...etc} var surname = { A: 'Analogue', B: 'Bomb', C: 'Catalyst', D: 'Discharge', E: 'Electron', ...etc}
测试用例示例
Test.assertEquals(aliasGen("Mike", "Millington"), "Malware Mike"); Test.assertEquals(aliasGen("Fahima", "Tash"), "Function T-Rex"); Test.assertEquals(aliasGen("Daisy", "Petrovic"), "Data Payload");
现有代码
function aliasGen(){ // Code Here // console.log(firstName) // console.log(surname) console.log(arguments) // { '0': 'Mike', '1': 'Millington' } let propertyNames = Object.values(arguments) console.log(propertyNames) // [ 'Mike', 'Millington' ] var firstLetters = propertyNames.map(name => name[0]) console.log(firstLetters, 'firstLetters') // [ 'M', 'M' ] 'firstLetters' let lettersRegexp = /[A-Z]/; if (firstLetters.map( letter => lettersRegexp.test(letter))) { var firstNamePseudoObj = Object.keys(firstName) .filter((key) => key.includes(firstLetters[0])) .reduce((obj, key) => { return Object.assign(obj, { [key]: firstName[key] }); }, {}); var lastNamePseudoObj = Object.keys(surname) .filter((key) => key.includes(firstLetters[1])) .reduce((obj, key) => { return Object.assign(obj, { [key]: surname[key] }); }, {}); let arrayOfPseudos = [Object.values(firstNamePseudoObj), Object.values(lastNamePseudoObj)].map(arr => String(arr)).join(' ') console.log(Object.values(firstNamePseudoObj), 'firstPseudo') // [ 'Malware' ] 'firstPseudo' console.log(Object.values(lastNamePseudoObj), 'lastPseudo') // [ 'Mike' ] 'lastPseudo' console.log(arrayOfPseudos) // Malware Mike return arrayOfPseudos } else { return `Your name must start with a letter from A - Z.` } }
失败测试日志
Log { '0': 'Anuddanumbha', '1': '23200' } [ 'Anuddanumbha', '23200' ] [ 'A', '2' ] 'firstLetters' false [ 'Alpha' ] 'firstPseudo' [] 'lastPseudo' Alpha Expected: 'Your name must start with a letter from A - Z.', instead got: 'Alpha ' --- Log { '0': '82ckt', '1': 'vuvmy' } [ '82ckt', 'vuvmy' ] [ '8', 'v' ] 'firstLetters' false [] 'firstPseudo' [] 'lastPseudo' --- Log { '0': 'di5io', '1': 'tudou' } [ 'di5io', 'tudou' ] [ 'd', 't' ] 'firstLetters' false [] 'firstPseudo' [] 'lastPseudo' Expected: 'Data T-Rex', instead got:
问题分析与修复方案
现存问题点
- 正则匹配范围窄:仅匹配大写字母,无法处理小写首字母的输入
- 条件判断逻辑错误:
firstLetters.map(...)返回布尔数组,数组在if判断中永远为真,导致不符合条件的情况无法触发提示 - 别名获取冗余:用
filter+reduce的方式取值过于复杂,且未处理首字母大小写转换 - 空值处理缺失:当首字母无法匹配时会返回空字符串拼接结果
修复后代码
function aliasGen(first, last) { // 匹配大小写字母的正则 const isLetter = /^[A-Za-z]$/; // 获取两个名字的首字符 const firstInitial = first[0]; const lastInitial = last[0]; // 检查任意一个首字符不是字母的情况 if (!isLetter.test(firstInitial) || !isLetter.test(lastInitial)) { return 'Your name must start with a letter from A - Z.'; } // 转成大写后直接从对象中取对应别名 const firstAlias = firstName[firstInitial.toUpperCase()]; const lastAlias = surname[lastInitial.toUpperCase()]; return `${firstAlias} ${lastAlias}`; }
修复说明
- 直接接收两个参数,替代
arguments更直观 - 正则扩展为匹配大小写字母,兼容小写首字母输入
- 用
||判断任意首字符不符合要求的情况,逻辑准确 - 首字母转大写后直接从对象取值,简化代码逻辑
- 避免数组处理带来的空值拼接问题
内容的提问来源于stack exchange,提问作者intercoder
相关产品推荐
相关产品推荐

