我有这样的程序
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 (firstName, prop) {
// Only change code below this line
for (var i = 0; i <= contacts.length; i++) {
if (contacts[i].firstName===firstName) {
if (contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop];
} else {
return "No such property";
}
}
}
}
// Change these values to test your function
lookUpProfile("Harry", "likes");
问题是,如果我不使用else
条件,上面的代码没有问题。但是当我添加else
条件时,第一个条件不会执行。
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 (firstName, prop) {
// Only change code below this line
for (var i = 0; i <= contacts.length; i++) {
if (contacts[i].firstName === firstName) {
if (contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop];
} else {
return "No such property";
}
} else if (contacts[i].firstName !== firstName) {
return "No such contact";
}
}
}
// Change these values to test your function
lookUpProfile("Harry", "likes");
当我用else
条件执行此代码时,第一个条件不会执行并直接跳转到else
条件。我错过了哪一步或做错了?
答案 0 :(得分:4)
将else
部分移动到函数的末尾,因为for循环中的单个return
会立即结束该函数。
function lookUpProfile(firstName, prop) {
for (var i = 0; i < contacts.length; i++) { // no i <= contacts.length
if (contacts[i].firstName === firstName) {
if (contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop];
} else {
return "No such property";
}
}
}
return "No such contact";
}
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"] }];
console.log(lookUpProfile("Houdini", "likes"));
console.log(lookUpProfile("Harry", "likes"));
console.log(lookUpProfile("Harry", "friends"));
&#13;
简短的方法是在Array#find
答案 1 :(得分:1)
return
语句停止执行循环并退出当前函数。 return总是立即退出它的函数,如果它在循环内,则不进行进一步的执行。
或者,我建议 @Nina Scholz 回答。
答案 2 :(得分:0)
发生的事情实际上是你进入你的循环,检查第一个联系人是否是你正在寻找的联系人,如果没有,在你有机会检查其他联系人之前,你会看到{ {1}}行和退出函数。
在 @Nina Scholz 的回答中,您可以将return "No such contact";
带到最后,因为您知道如果达到这一点,您已查看了所有联系人和避风港从函数返回。
我没有足够的声誉来评论 - 因为这是一个答案,我通过对您的代码进行最少的编辑来实现这一目标:
return
答案 3 :(得分:0)
以下功能应该可以正常工作:
function lookUpProfile(firstName, prop)
{
for(var i=0; i<contacts.length; i++)
{
if(contacts[i].firstName==firstName)
{
if(contacts[i].hasOwnProperty(prop))
{
return contacts[i][prop];
}
else
{
return "No such property";
}
}
}
return "No such contact";
}
在原始功能中,我看到三个问题:
1)for -loop条件中的问题
原始的for循环是以下
for(var i=0; i<=contacts.length; i++)
在循环中,停止条件是i&lt; = contacts.length。该 contacts数组具有零基索引,因此是原始的 条件是:我与contacts.length“小于等于”。问题 是接触的长度是4,但由于索引是零的, 当我输入4并因此超过阵列时,你会得到一个错误 边界。因此,条件必须是i“小于”contacts.length。
修复:for(var i=0; i<contacts.length; i++)
2)if -clause中的额外“=”:
if(contacts[i].firstName===firstName)
修正:
if(contacts[i].firstName==firstName)
3)如果firstName不是第一个索引
,则始终触发if -condition触发器如果第一个联系人不是,那么else if -condition会一直触发 我们正在寻找的,即如果if(contacts [i] .firstName == firstName)失败, 如果是真的话,那么其他。
修正: 移动'返回'没有这样的联系“;'到功能结束。当我们回来 来自其他分支的价值,返回更方便 如果我们没有得到匹配,最后“没有这样的联系”。
希望这会有所帮助。如果您有其他问题,我很乐意提供更多帮助。
谢谢!