![](/img/trans.png)
[英]I have two different domains with the same code, but one of them doesn't work. Why?
[英]If I don't nest the if/else statements, the code doesn't work. Why do I have to nest?
我正在学习JavaScript并且有一个结合访问对象属性,循环和if / else语句的练习。
我的代码不起作用。 解决方案(可以工作)嵌套if / else语句,但看起来似乎是相同的代码。 我不明白其中的区别。
该函数应检查name是否是实际联系人的firstName,并且给定属性(prop)是该联系人的属性。
如果两者都为真,则返回该属性的“值”。
如果名称与任何联系人不对应,则返回“没有此类联系人”
如果prop不符合找到匹配名称的联系人的任何有效属性,则返回“No such property”
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){
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop];
} else if (contacts[i].firstName !== name) {
return "No such contact";
} else {
return "No such property";
}
}
lookUpProfile("Sherlock", "likes");
//should return ["Intriguing Cases", "Violin"]
(哪个确实有效)
for (var x = 0; x < contacts.length; x++){
if (contacts[x].firstName === name) {
if (contacts[x].hasOwnProperty(prop)) {
return contacts[x][prop];
} else {
return "No such property";
}
}
}
return "No such contact";
lookUpProfile("Sherlock", "likes");
//returns ["Intriguing Cases", "Violin"]
我预计这两种解决方案都会起作用,但我的解决方案却没有。 为什么?
在解决方案中,您将查找具有匹配名称的联系人。 一旦找到所提供名称的联系人,就会返回,这意味着循环结束(可能是早期)。 你返回的内容取决于道具是否存在,但你要返回。
在您的尝试中,您每次都会返回循环的第一次迭代。 如果您想保持相同的行为,那么这就是您的代码应该是什么样子:
function lookUpProfile(name, prop){
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop];
} else if (contacts[i].firstName === name && !contacts[i].hasOwnProperty(prop)) {
return "No such property";
}
}
return "No such contact";
}
在这种情况下,您可以看到contacts [i] .firstName如何被检查两次。 那是因为如果您还没有找到具有给定名称的联系人,则不希望退出循环返回。 嵌套通过减少对复杂条件表达式的重复检查来清除它。
后来我意识到问题的一部分是我对条件语句的最后一部分很懒:
else { return "No such property"; }
如果我写了出来
if (contacts[x].firstName === name && !(contacts[x].hasOwnProperty(prop))
满足这个要求:
然后我会看到嵌套if语句重复性较低。
另一个问题是最后一个“lazy”else语句提供了一个默认值,并且总是以contacts [0]结束该函数。 这意味着只有联系人[0]才能通过该功能; 不再与联系人进行迭代[1]。 联系人[2]等(良好的学习经历!)
您的代码不起作用,因为一旦名称不等于给定名称,您将立即返回。
所以让我们运行你的程序。
i = 0,我们将联系人[0] .name = Akira与Sherlock进行比较。 这个名字是否等于Sherlock? 不,不是的。 所以你的第一个if if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
condition if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
。 我们进入下一个条件,你的其他如果:
else if (contacts[i].firstName !== name) {
return "No such contact";
这种情况是真的。 所以我们马上回来。
你看到你的代码过早地返回了吗? 它不允许我们实际前进。
您需要做的是将返回放在for循环之外。 我不会给你确切的解决方案,因为这显然是一个家庭作业解决方案。 但暗示应该让你前进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.