javascript中的其他条件不起作用

时间:2016-11-02 10:26:36

标签: javascript

我有这样的程序

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条件。我错过了哪一步或做错了?

4 个答案:

答案 0 :(得分:4)

else部分移动到函数的末尾,因为for循环中的单个return会立即结束该函数。

&#13;
&#13;
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;
&#13;
&#13;

简短的方法是在Array#find

的ES6中使用

答案 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)失败, 如果是真的话,那么其他。

修正: 移动'返回'没有这样的联系“;'到功能结束。当我们回来 来自其他分支的价值,返回更方便 如果我们没有得到匹配,最后“没有这样的联系”。

希望这会有所帮助。如果您有其他问题,我很乐意提供更多帮助。

谢谢!