FOR循环中的嵌套IF仅适用于第一个值

时间:2018-03-10 15:39:06

标签: javascript arrays object for-loop if-statement

我有一个对象数组,我想迭代它们。这个数组的一个对象如下所示:

var people = [
{
    "firstName": "YYY",
    "lastName": "XXX",
    "number": "123456789",
    "attribute": ["strong", "quick", "stupid"]
},
{
    "firstName": "AAA",
    "lastName": "BBB",
    "number": "9876543210",
    "attribute": ["calm", "wise", "slow"]
},
{
    "firstName": "CCC",
    "lastName": "VVV",
    "number": "158974528",
    "attribute": ["brutal", "bad", "gentle"]
}

依此类推(在数组中有20个对象)。

等等。我尝试编写一个函数来检查我的people数组中是否存在firstName,以及该属性是否是该联系人的属性。 所以如果我用属性调用函数:

lookUpProfile("YYY", "lastName");

它应该返回该对象的属性值。 在这种情况下:["strong", "quick", "stupid"]

它实际上做的是我的函数只检查第一个对象然后停止......所以只有当我用带有与数组中第一个对象匹配的参数调用此函数时它才有效。如果我这样调用函数:

lookUpProfile("CCC", "number");

它返回我"没有这样的联系"。这里有什么问题所以循环只检查第一个对象?

以下是功能代码:

function lookUpProfile(firstName, attribute){
   for (i = 0; i < people.length; i++) {
      if (firstName == people[i].firstName && firstName == people[i].firstName) {
         return (people[i][attribute]); 
      }      
      else {
        return "No such contact";
    }
   }

感谢所有回复!它有很大帮助。但我忘了提一件事。我还想检查对象中是否存在给定的属性(属性)。

所以如果我调用函数lookUpProfile("YYY", "YourAGE"); 它将归还我&#34;没有这样的财产&#34 ;;

我的功能现在看起来像这样:

function lookUpProfile(firstName, prop){
   for (i = 0; i < people.length; i++) {
      if (firstName == people[i].firstName && people[i].hasOwnProperty(prop))  
        return (people[i][prop]); 
      else if(firstName != people[i].firstName) {
        return "No such contact";
      }
      else if(people[i].hasOwnProperty(attribute) == false) {
        return "No such property";
      }

  }

return "No such contact";

谢谢大家!我得到了工作解决方案。最后一个问题:你能解释一下这句话:if (firstName == people[i].firstName) firstNameFound = true;吗?我不明白这一行 - 为什么在IF语句之后调用变量? ;)

2 个答案:

答案 0 :(得分:2)

这里发生的是return语句导致函数在到达它的位置退出。因此,在循环的第一个实例之后,由于不满足条件,if-else块返回并且函数执行结束。

你想要做的是在循环完成并且每次检查都已执行后返回“没有这样的联系”。就这样:

function lookUpProfile(firstName, attribute){
    for (i = 0; i < people.length; i++) {
        if (firstName == people[i].firstName && firstName == people[i].firstName) {
            return (people[i][attribute]); 
        }      
    }
    return "No such contact";
}

此代码将执行循环,检查数组中的每个人是否有条件。如果它们中的任何一个匹配则返回,否则在它们全部被检查后返回。

编辑:由于您需要调整最终的return语句,因此您需要使用else块来设置标识,以标识未满足的条件:

function lookUpProfile(firstName, prop) {
    var firstNameFound = false;
    for (i = 0; i < people.length; i++) {
        if (firstName == people[i].firstName && prop == people[i].hasOwnProperty(prop)) {
            return (people[i][prop]);
        } 
        else {
            if (firstName == people[i].firstName) firstNameFound = true;
        }
    }
    if (firstNameFound) return "No such property";
    else return "No such contact";
}

编辑2:此处只需要一个标记。如果循环结束并且已设置,我们可以假设第二个条件失败,因为名称首先被测试。

编辑3:修正了一些错误。这是一个有效的JSFiddle,其代码与上面相同:https://jsfiddle.net/bfhev7gL/16/

编辑4 要回答有关第二个if行的上一个问题,将为变量(在初始化期间以前指定为false)分配值{{1如果满足对名字存在的检查。由于这个条件的结果可以在一行中解决,我们可以简单地在它之后附加该行,而不需要将它包装在大括号中。

在循环结束时,我们可以确认如果已分配,则至少有一个true匹配,但由于循环已完成且未返回,因此firstNameprop不匹配1}}做了。然后我们可以调整它周围的错误返回;如果firstName匹配,我们会通知用户firstName没有,否则找不到prop,我们可以通知用户。

答案 1 :(得分:1)

它仅适用于第一个值,因为您从else语句返回控件。你应该使用for循环的else return语句outsite来工作,并从for循环中删除else语句。

谢谢!