三元语句返回数据异常,请求排查lookUpProfile函数问题
问题排查与修复方案
我来帮你梳理下代码里的问题,以及怎么修复它:
你的代码核心问题
forEach循环的局限性:forEach是用来遍历数组执行副作用的,它不会返回任何值,你在循环里写的三元表达式只是计算了结果,但完全没有把这个结果传递出去。循环结束后,函数直接执行最后一行的return "no such contact",所以不管输入什么,最终都会返回这个字符串。- 缺少流程控制:找到匹配的联系人后,你需要停止遍历并处理属性检查,但
forEach没办法中途终止循环,这会导致不必要的遍历。 - 字符串大小写不匹配需求:你返回的
"no such property"和"no such contact"是全小写的,但题目要求的是首字母大写的"No such property"和"No such contact"。
修复后的代码
我们可以用find方法快速定位到匹配的联系人,然后按逻辑分支处理:
var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number": "0543236543", "likes": ["Pizza", "Coding", "Brownie Points"] }, { "firstName": "Harry", "lastName": "Potter", "number": "0994372684", "likes": ["Hogwarts", "Magic", "Hagrid"] }, { "firstName": "Sherlock", "lastName": "Holmes", "number": "0487345643", "likes": ["Intriguing Cases", "Violin"] }, { "firstName": "Kristian", "lastName": "Vos", "number": "unknown", "likes": ["JavaScript", "Gaming", "Foxes"] } ]; function lookUpProfile(name, prop){ // 先找到匹配firstName的联系人 const targetContact = contacts.find(contact => contact.firstName === name); // 分支1:没有找到匹配的联系人 if (!targetContact) { return "No such contact"; } // 分支2:找到了联系人,检查属性是否存在 if (targetContact.hasOwnProperty(prop)) { return targetContact[prop]; } else { return "No such property"; } } // 测试调用 console.log(lookUpProfile("Akira", "likes")); // 会返回 ["Pizza", "Coding", "Brownie Points"]
代码逻辑说明
- 用
find方法遍历数组,找到第一个firstName匹配name的联系人对象,找不到的话返回undefined。 - 先判断是否找到联系人:没找到直接返回
"No such contact"。 - 找到联系人后,用
hasOwnProperty检查目标属性是否存在:存在就返回属性值,不存在返回"No such property"。
如果你坚持想用循环(比如for循环)来实现,也可以这样写:
function lookUpProfile(name, prop){ for (let i = 0; i < contacts.length; i++) { const contact = contacts[i]; if (contact.firstName === name) { // 找到联系人,检查属性 return contact.hasOwnProperty(prop) ? contact[prop] : "No such property"; } } // 循环结束都没找到匹配的联系人 return "No such contact"; }
这个写法的好处是,找到匹配的联系人后可以直接return终止函数,避免多余的循环。
内容的提问来源于stack exchange,提问作者Angela Inniss
相关产品推荐
相关产品推荐

