Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果我没有';如果不嵌套if/else语句,则代码不会';不行。我为什么要筑巢? 概述_Javascript_If Statement_Nested - Fatal编程技术网

Javascript 如果我没有';如果不嵌套if/else语句,则代码不会';不行。我为什么要筑巢? 概述

Javascript 如果我没有';如果不嵌套if/else语句,则代码不会';不行。我为什么要筑巢? 概述,javascript,if-statement,nested,Javascript,If Statement,Nested,我正在学习JavaScript,有一个结合访问对象属性、循环和if/else语句的练习 我的代码不起作用。解决方案(有效)嵌套了if/else语句,但在其他方面似乎是相同的代码。我不明白有什么区别 练习指导 该函数应检查姓名是否为实际联系人的名字,以及给定属性(prop)是否为该联系人的属性 如果两者都为true,则返回该属性的“值” 如果姓名与任何联系人不对应,则返回“无此类联系人” 如果prop与找到的与姓名匹配的联系人的任何有效属性不对应,则返回“无此类属性” 给定数组 我的代码 (这

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

我的代码不起作用。解决方案(有效)嵌套了if/else语句,但在其他方面似乎是相同的代码。我不明白有什么区别

练习指导
  • 该函数应检查姓名是否为实际联系人的名字,以及给定属性(prop)是否为该联系人的属性

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

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

  • 如果prop与找到的与姓名匹配的联系人的任何有效属性不对应,则返回“无此类属性”

给定数组 我的代码 (这不起作用)


函数lookUpProfile(名称、属性){
对于(变量i=0;i
运动方案 (哪个有效)

for(变量x=0;x
为什么?
我原以为这两个解决方案都能工作,但我的解决方案不行。为什么?

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

在尝试中,每次循环的第一次迭代都会返回。如果希望保持相同的行为,代码应该是这样的:

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";
}
函数lookUpProfile(名称、属性){
对于(变量i=0;i

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

我后来意识到,部分问题是我对条件的最后一部分感到懒惰声明:

else{
返回“无此类财产”;
}

如果我写出来的话

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

为满足这一要求:

  • 如果prop与找到的与姓名匹配的联系人的任何有效属性不对应,则返回“无此类属性”
然后我会发现嵌套if语句的重复性会降低


另一个问题是,最后一个“lazy”else语句提供了一个默认值,并且总是以联系人[0]结束函数。这意味着只有联系人[0]会通过函数;没有联系人[1]的进一步迭代。联系人[2]等等。(学习经验很好!)

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

让我们运行你的程序

i=0,我们比较联系人[0]。name=Akira和Sherlock。姓名是否等于Sherlock?否。因此,您的第一个if
if(联系人[i]。firstName==name&&contacts[i]。hasOwnProperty(prop)){
条件失败。我们进入下一个条件,如果:

else if (contacts[i].firstName !== name) {
        return "No such contact";
这个条件是真的,所以我们马上回来

你看到你的代码如何过早地返回了吗?它不允许我们真正前进


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

这两个代码块做的事情不同,例如,看看您在哪里检查HasownProperty。实际上,此代码并没有满足所有的要求irements。我试过使用它,反馈是
lookUpProfile(“Bob”,“number”);
应该返回“No-this contact”,但是没有。你是对的,我忘记了“else-if”中条件的第二部分。为了将来的答案寻求者而更新。
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";
}
else if (contacts[i].firstName !== name) {
        return "No such contact";