【问题标题】:Nested IF inside FOR loop works only for first valueFOR 循环内的嵌套 IF 仅适用于第一个值
【发布时间】:2018-08-19 00:51:15
【问题描述】:

我有一个对象数组,我想遍历它们。该数组的一个对象如下所示:

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 个对象)。

等等。我尝试编写一个函数来检查我的人员数组中是否存在 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"); 它会返回“没有这样的财产”;

我的函数现在看起来像这样:

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 语句之后调用变量? ;)。

【问题讨论】:

  • 如果if ( ... ) 中的条件(检查同一件事两次 O.o)不满足会发生什么?关键字return的用途是什么?
  • "在这种情况下:["strong", "quick", "stupid"]" 应该是 "在这种情况下:"XXX""
  • 这是我代码中的错字。正确的在我的帖子底部给出:)。因此:如果 firstName 是对象的名称,并且该对象具有函数中给定的属性,则它应返回该属性。如果数组中不存在 firstName - 返回应为“No such contact”。如果对象中不存在该属性 - 返回“没有此类属性”。

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


【解决方案1】:

这里发生的是 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 的最后一个问题,如果检查满足现有的名字。由于这个条件的结果可以在一行中解决,我们可以简单地在它后面追加一行,而不需要用大括号括起来。

在循环结束时,我们可以肯定,如果它被赋值,那么至少有一个firstName匹配,但是由于循环结束并且没有返回,那么prop不匹配,而firstName已经匹配。然后我们可以围绕它调整错误返回;如果firstName 匹配,我们通知用户prop 不匹配,否则firstName 未找到开头,我们可以通知用户。

【讨论】:

  • @icelandico 然后edit您的问题并添加此信息。
  • 几乎!当给出错误的属性时,它仍然不会返回“No such property”。
【解决方案2】:

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

谢谢!

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2019-05-22
    • 2020-07-19
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多