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

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: 

问题分析与修复方案

现存问题点

  1. 正则匹配范围窄:仅匹配大写字母,无法处理小写首字母的输入
  2. 条件判断逻辑错误:firstLetters.map(...)返回布尔数组,数组在if判断中永远为真,导致不符合条件的情况无法触发提示
  3. 别名获取冗余:用filter+reduce的方式取值过于复杂,且未处理首字母大小写转换
  4. 空值处理缺失:当首字母无法匹配时会返回空字符串拼接结果

修复后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:40:35