使用for循环与条件运算符查找数组对象属性失败,求原因
问题:条件运算符实现lookUpProfile函数失效原因分析
需求说明
需要实现一个名为lookUpProfile的函数,遍历以下包含多个对象的contacts数组,根据指定条件返回对应属性值:
const 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"], }, ];
条件要求
- 若姓名存在于
contacts数组中,需检查该对象是否包含指定prop; - 若
prop不存在,返回"No such property"; - 若姓名不存在,返回
"No such contact"。
问题代码
此前用if-else if可成功实现功能,但改用条件运算符编写的代码无法正常工作:
function lookUpProfile(name, prop) { for (let i=0;i<contacts.length;i++) { return contacts[i].firstName===name ? contacts[i].hasOwnProperty(prop) ? contacts[i][prop] : "No such property" : 0 } return "No such name"; }
失效原因
代码存在两个核心问题:
- 循环提前终止:
for循环的第一次迭代就执行了return语句,无论当前对象是否匹配目标姓名,都会直接返回结果。这导致循环仅检查第一个元素就结束,完全不会遍历后续对象。 - 不匹配时的返回逻辑错误:当当前对象的
firstName不等于目标name时,代码返回了0,而非继续循环检查下一个对象,直接中断了遍历流程,无法找到后续可能匹配的对象。
修正后的代码
混合if与条件运算符(可读性更高)
仅在找到匹配姓名的对象时,用条件运算符处理属性判断,否则继续循环;遍历结束未找到匹配对象时返回指定结果:
function lookUpProfile(name, prop) { for (let i = 0; i < contacts.length; i++) { if (contacts[i].firstName === name) { return contacts[i].hasOwnProperty(prop) ? contacts[i][prop] : "No such property"; } } return "No such contact"; }
纯条件运算符实现
如果必须完全使用条件运算符,可调整逻辑,仅在匹配时执行返回,不匹配时让循环继续:
function lookUpProfile(name, prop) { for (let i = 0; i < contacts.length; i++) { contacts[i].firstName === name && (return contacts[i].hasOwnProperty(prop) ? contacts[i][prop] : "No such property"); } return "No such contact"; }
内容的提问来源于stack exchange,提问作者Juan Yeremia
相关产品推荐
相关产品推荐

