字母转字母表位置函数返回结果按字母序而非输入序的问题排查
问题:字母转位置函数返回结果顺序不符预期
你编写的函数目标是将输入单词的每个字母转换为其在字母表中的对应位置,但当前返回结果按字母表顺序排列,而非输入单词的顺序。例如输入alex,预期输出[1, 12, 5, 24],实际返回[1, 5, 12, 24]。
问题原因
你的代码逻辑是先遍历字母表(从a到z),再遍历输入的每个字母,只要字母表中的字母与输入字母匹配,就将位置推入结果数组。这种遍历顺序会导致结果按字母表排序,完全忽略了输入单词的原始字母顺序。此外,result作为全局变量,多次调用函数会保留之前的结果,存在数据污染隐患。
修正方案
方案1:保持字母表数组,按输入顺序遍历
function replace(word) { const alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; const result = []; // 按输入单词的字母顺序遍历 word.split('').forEach(letter => { // 获取字母在字母表中的索引,加1得到对应位置 const position = alphabet.indexOf(letter) + 1; result.push(position); }); console.log(result); return result; } replace('alex'); // 输出 [1, 12, 5, 24]
方案2:利用ASCII码计算,无需维护字母表
可以通过字符的ASCII编码直接计算位置,省去手动维护字母表数组的麻烦,还能兼容大写字母:
function replace(word) { const result = []; for (const letter of word) { // 小写字母a的ASCII码是97,所以位置 = 字符码 - 96 const position = letter.toLowerCase().charCodeAt(0) - 96; result.push(position); } console.log(result); return result; } replace('alex'); // 输出 [1, 12, 5, 24]
修正说明
- 将
result和alphabet移至函数内部,避免全局变量污染,保证每次调用函数的独立性。 - 改为优先遍历输入单词的字母,确保结果顺序与输入完全一致。
- 方案2通过字符编码计算位置,逻辑更简洁高效,同时支持大小写输入转换。
内容的提问来源于stack exchange,提问作者Alexandro Pineda
相关产品推荐
相关产品推荐

