我可以使用带有 if 语句的 for 循环代替 .hasOwnProperty()
Can I use a for loop with if statement in place of .hasOwnProperty()
我正在完成 freeCodeCamp javascript 并卡在了 "profile lookup" 练习中,因为我忘记了 .hasOwnProperty() 函数,但我仍然不确定为什么我的原始函数没有不行。我将留下给定数组的一部分以供参考。
//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")
当我遗漏我的
else {return "No such property";}
行有效,但除此之外,无论 'prop' 输入是什么,都只是 returns "No such property"。
在您的代码中:
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
发现的那样,您要做的是测试每个键,然后 return "No such property" 如果您到达最后:
for(let y in contacts[x]){
if(prop === y){
return contacts[x][prop];
}
}
return "No such property";
顺便说一句,请使用更多的白色 space - 将内容挤在一行上会更难阅读。
您的问题是循环中的 if else 语句:
if(prop === y){
return contacts[x][prop];
} else {
return "No such property";
}
根据您的代码,您只检查联系人对象的第一个 属性,因为如果当前 属性 是,您的 if else 语句 returns no 属性 checked 与正在查找的不匹配。这种情况使得它不检查其余属性,只检查第一个属性(不管它是否正确)
要解决此问题,请将 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";
}
}
这样,如果您完成循环但仍未找到有效的 属性,它将正确 return "no such property" 消息,反之亦然,如果您找到正确的 属性,它将 return 属性 值
只需将内循环中 if 条件的 else 部分移出该循环。因为,代码执行在比较第一个 属性.
之后立即返回
我正在完成 freeCodeCamp javascript 并卡在了 "profile lookup" 练习中,因为我忘记了 .hasOwnProperty() 函数,但我仍然不确定为什么我的原始函数没有不行。我将留下给定数组的一部分以供参考。
//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")
当我遗漏我的
else {return "No such property";}
行有效,但除此之外,无论 'prop' 输入是什么,都只是 returns "No such property"。
在您的代码中:
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
发现的那样,您要做的是测试每个键,然后 return "No such property" 如果您到达最后:
for(let y in contacts[x]){
if(prop === y){
return contacts[x][prop];
}
}
return "No such property";
顺便说一句,请使用更多的白色 space - 将内容挤在一行上会更难阅读。
您的问题是循环中的 if else 语句:
if(prop === y){
return contacts[x][prop];
} else {
return "No such property";
}
根据您的代码,您只检查联系人对象的第一个 属性,因为如果当前 属性 是,您的 if else 语句 returns no 属性 checked 与正在查找的不匹配。这种情况使得它不检查其余属性,只检查第一个属性(不管它是否正确)
要解决此问题,请将 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";
}
}
这样,如果您完成循环但仍未找到有效的 属性,它将正确 return "no such property" 消息,反之亦然,如果您找到正确的 属性,它将 return 属性 值
只需将内循环中 if 条件的 else 部分移出该循环。因为,代码执行在比较第一个 属性.
之后立即返回