我正在使用freeCodeCamp javascript并且卡在“profile lookup”练习上因为我忘记了.hasOwnProperty()函数,但我仍然不确定为什么我的原始函数不起作用。我将离开给定阵列的一部分以供参考。
self.user.username = newName
当我遗漏我的
时//Setup
var contacts = [
{
"firstName": "Akira",
"lastName": "Laine",
"number": "0543236543",
"likes": ["Pizza", "Coding", "Brownie Points"]
},
{
"firstName": "Harry",
"lastName": "Potter",
"number": "0994372684",
"likes": ["Hogwarts", "Magic", "Hagrid"]
};
function lookUpProfile(name, prop){
// Only change code below this line
for(let x in contacts){
if(name === contacts[x].firstName){
for(let y in contacts[x]){
if(prop === y){
return contacts[x][prop];
} else {return "No such property";}
}
}
} return "No such contact";
// Only change code above this line
}
// Change these values to test your function
lookUpProfile("Akira", "likes")
行可行,但无论“prop”输入是什么,否则只返回“No such property”。
答案 0 :(得分:1)
在您的代码中:
for(let y in contacts[x]){
if(prop === y){
return contacts[x][prop];
} else {return "No such property";}
}
例如,如果prop
为likes
,则第一次循环y
可能等于firstName
。 if ("likes" === "firstName")
是假的,所以我们return "No such property";
。
正如您通过删除else
所发现的那样,您要做的是测试每个密钥,如果您到达目的地,则返回“No such property”:
for(let y in contacts[x]){
if(prop === y){
return contacts[x][prop];
}
}
return "No such property";
顺便说一句,请使用更多的空白区域 - 在一行上将所有东西堵塞起来要难得多。
答案 1 :(得分:1)
您的问题是循环中的if else语句:
if(prop === y){
return contacts[x][prop];
} else {
return "No such property";
}
根据您的代码,您只检查联系人对象的第一个属性,因为如果检查的当前属性与正在查找的属性不匹配,则if else语句将不返回任何属性。这个条件使得它不会检查剩下的属性而只检查第一个属性(无论它是否正确)
要解决此问题,请将return语句移动到用于检查属性的循环的末尾:
for(let x in contacts){
if(name === contacts[x].firstName){
for(let y in contacts[x]){
if(prop === y) return contacts[x][prop];
}
return "No such property";
}
}
这样,如果你完成循环并且仍然没有找到有效的属性,它将正确地返回"没有这样的属性"消息,反之亦然,如果您找到了正确的属性,它将返回属性值
答案 2 :(得分:0)
将你的内部循环中的if条件的一部分移出该循环。因为,在比较第一个属性后,代码执行正在返回。