这是我第一次在这里提问,所以如果之前重复了这个问题,我很抱歉。
这是我针对freeCodeCampJS问题的官方解决方案:
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"],
},
];
function lookUpProfile(name, prop) {
for(let i = 0; i<contacts.length;i++){
if(contacts[i].firstName == name && contacts[i].hasOwnProperty(prop)){
return contacts[i][prop];
}
else {
return "No such property"
}
}
return "No such contact";
}
console.log(lookUpProfile("Kristian", "lastName")); //Output: No such property
这是在"嵌套if"循环中进行更改的官方解决方案:
function lookUpProfile(name, prop) {
for(let i = 0; i<contacts.length;i++){
if(contacts[i].firstName == name){
if(contacts[i].hasOwnProperty(prop)){
return contacts[i][prop];
}
else {
return "No such property"
}
}
}
return "No such contact";
}
console.log(lookUpProfile("Kristian", "lastName")); //Output: Vos
为什么我会得到不同的解决方案,即使官方解决方案中嵌套if的背后的逻辑与我的相似?
它们在逻辑上并不相同。
他们是这样的:
for (/*...*/) {
if (a) {
if (b) {
return X;
} else {
return Y;
}
}
}
请注意,如果a
不为真,则两个return
都不会发生,循环将继续进行下一次迭代。
但你的是:
for (/*...*/) {
if (a && b) {
return X;
} else {
return Y;
}
}
即使a
为false,它也会返回,永远不会进入下一个循环迭代。
如果你想把外部测试和内部测试结合起来,那就是:
for (/*...*/) {
if (a && b) {
return X;
} else if (a) { // <===
return Y;
}
}
但这并不像最初的那样清楚,最终不必要地测试了两次a
。