繁体   English   中英

如果我没有嵌套if / else语句,则代码不起作用。 我为什么要窝?

[英]If I don't nest the if/else statements, the code doesn't work. Why do I have to nest?

概观

我正在学习JavaScript并且有一个结合访问对象属性,循环和if / else语句的练习。

我的代码不起作用。 解决方案(可以工作)嵌套if / else语句,但看起来似乎是相同的代码。 我不明白其中的区别。

运动指示

  • 该函数应检查name是否是实际联系人的firstName,并且给定属性(prop)是该联系人的属性。

  • 如果两者都为真,则返回该属性的“值”。

  • 如果名称与任何联系人不对应,则返回“没有此类联系人”

  • 如果prop不符合找到匹配名称的联系人的任何有效属性,则返回“No such property”

给定的数组

 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"]

为什么?

我预计这两种解决方案都会起作用,但我的解决方案却没有。 为什么?

在解决方案中,您将查找具有匹配名称的联系人。 一旦找到所提供名称的联系人,就会返回,这意味着循环结束(可能是早期)。 你返回的内容取决于道具是否存在,但你要返回。

在您的尝试中,您每次都会返回循环的第一次迭代。 如果您想保持相同的行为,那么这就是您的代码应该是什么样子:

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";
}

在这种情况下,您可以看到contacts [i] .firstName如何被检查两次。 那是因为如果您还没有找到具有给定名称的联系人,则不希望退出循环返回。 嵌套通过减少对复杂条件表达式的重复检查来清除它。

后来我意识到问题的一部分是我对条件语句的最后一部分很懒:

else { return "No such property"; }

如果我写了出来

if (contacts[x].firstName === name && !(contacts[x].hasOwnProperty(prop))

满足这个要求:

  • 如果prop不符合找到匹配名称的联系人的任何有效属性,则返回“No such property”

然后我会看到嵌套if语句重复性较低。

另一个问题是最后一个“lazy”else语句提供了一个默认值,并且总是以contacts [0]结束该函数。 这意味着只有联系人[0]才能通过该功能; 不再与联系人进行迭代[1]。 联系人[2]等(良好的学习经历!)

您的代码不起作用,因为一旦名称不等于给定名称,您将立即返回。

所以让我们运行你的程序。

i = 0,我们将联系人[0] .name = Akira与Sherlock进行比较。 这个名字是否等于Sherlock? 不,不是的。 所以你的第一个if if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) { condition if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) { 我们进入下一个条件,你的其他如果:

else if (contacts[i].firstName !== name) {
        return "No such contact";

这种情况是真的。 所以我们马上回来。

你看到你的代码过早地返回了吗? 它不允许我们实际前进。

您需要做的是将返回放在for循环之外。 我不会给你确切的解决方案,因为这显然是一个家庭作业解决方案。 但暗示应该让你前进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM