如何使用JavaScript二维数组按用户输入查找实现精灵名字生成器
问题根源
你的代码核心问题是Array.find()的回调函数逻辑错误:
find方法会遍历数组的每一项,把当前遍历到的子数组传给回调函数,需要回调返回布尔值来判断当前项是否匹配要求- 你现在的回调直接返回传入的子数组,子数组属于JS里的真值,所以
find永远会匹配到第一个子数组,这就是你只会输出第一项的原因 - 另外拿到匹配的子数组后,需要手动取下标为1的元素,才是你要的名字值
修复方案(基于现有二维数组逻辑)
修改回调判断逻辑,匹配子数组下标0的首字母,匹配成功后取下标1的值即可:
var firstNames = [ ["A","Angelic"], ["B","Blustery"], // 其余数组项保持不变 ["Y","Cheery"], ["Z","Dancy"] ]; var firstInitial = window.prompt("你名字的首字母是什么:").toUpperCase(); // 传入匿名回调,判断当前子数组第0位等于用户输入的首字母 let matchedItem = firstNames.find(item => item[0] === firstInitial); // 匹配成功取第1位,匹配失败给默认提示 let elfFirstName = matchedItem ? matchedItem[1] : "未知"; window.alert("你的精灵名字是 " + elfFirstName); </script>
如果需要兼容旧版JS不支持箭头函数,把回调改成普通函数即可:
function firstSearch(item) { return item[0] === firstInitial; } let matchedItem = firstNames.find(firstSearch);
优化方案(更适合教学的对象实现)
如果不用二维数组,直接用首字母作为键、名字作为值的对象存储数据,查找逻辑更直观,不用遍历数组,性能和可读性都更好:
var firstNameMap = { "A": "Angelic", "B": "Blustery", // 其余项保持不变 "Y": "Cheery", "Z": "Dancy" }; var firstInitial = window.prompt("你名字的首字母是什么:").toUpperCase(); // 直接用键取值即可,没有匹配到返回默认值 let elfFirstName = firstNameMap[firstInitial] || "未知"; window.alert("你的精灵名字是 " + elfFirstName); </script>
内容的提问来源于stack exchange,提问作者ROADRUNNER87
相关产品推荐
相关产品推荐

