我正在学习JavaScript,并且有一个结合访问对象属性,循环和if / else语句的练习。
我的代码不起作用。该解决方案(有效)嵌套了if / else语句,但其他方面似乎是相同的代码。我不明白其中的区别。
该函数应检查name是否是实际联系人的名字,并且给定属性(prop)是该联系人的属性。
如果两者都为true,则返回该属性的“值”。
如果姓名与任何联系人都不对应,则返回“没有此类联系人”
如果prop不符合与姓名匹配的联系人的任何有效属性,则返回“无此属性”
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"]
我希望这两种解决方案都可以,但我的却行不通。为什么?
答案 0 :(得分:3)
在解决方案中,您将查找具有匹配名称的联系人。找到具有提供的姓名的联系人后,您将返回,这意味着循环结束(可能更早)。返回的内容取决于道具是否存在,但您确实会返回。
尝试时,每次都会返回循环的第一次迭代。如果您想保持相同的行为,则代码应该是这样的:
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";
}
您可以看到在这种情况下两次如何检查contact [i] .firstName。这是因为如果您还没有找到具有给定名称的联系人,则不想返回该循环。嵌套通过减少对复杂条件表达式的重复检查来清除这种情况。
答案 1 :(得分:0)
后来我意识到问题的一部分是我对条件语句的最后一部分很懒:
else {
return "No such property";
}
如果我改写了
if (contacts[x].firstName === name && !(contacts[x].hasOwnProperty(prop))
满足此要求:
然后我会看到if语句重复性较差的嵌套。
另一个问题是最后一个“惰性” else语句提供了默认值,并且始终以contacts [0]结尾该函数。这意味着只有contacts [0]会通过该函数传递;没有更多关于contact [1]的迭代。联系人[2]等(良好的学习经验!)
答案 2 :(得分:0)
您的代码无效,因为一旦名称不等于给定名称,您将立即返回。
因此,让我们运行您的程序。
i = 0,我们将contact [0] .name = Akira与Sherlock进行比较。这个名字等于夏洛克吗?不,不是的。因此,您的第一个if if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
条件失败。我们进入下一个条件,如果满足以下条件,则为您的其他条件
else if (contacts[i].firstName !== name) {
return "No such contact";
这个条件成立。所以我们立即返回。
您是否看到代码过早返回?它不允许我们真正向前迈进。
您需要做的是将返回值置于for循环之外。我不会提供确切的解决方案,因为这显然是一项家庭作业解决方案。但是提示应该使您前进。