如果我不嵌套if / else语句,那么代码将无法正常工作。我为什么要筑巢?

时间:2019-04-03 19:52:49

标签: javascript if-statement nested

概述

我正在学习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"]

为什么?

我希望这两种解决方案都可以,但我的却行不通。为什么?

3 个答案:

答案 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))

满足此要求:

  • 如果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循环之外。我不会提供确切的解决方案,因为这显然是一项家庭作业解决方案。但是提示应该使您前进。