javascript - FOR 循环内的嵌套 IF 仅适用于第一个值

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

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

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"); 它会返回给我“没有这样的属性(property)”;

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

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

最佳答案

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

这里你想要做的是在循环完成并且执行了每个检查之后返回“no such contact”。因此:

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

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

编辑:由于您需要对最终返回语句进行条件限制,因此您需要使用 else block 来设置一个标志来标识未满足哪个条件:

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)是如果满足对名字现有的检查,则分配值true。由于该条件的结果可以在一行中解析,因此我们可以简单地在其后面追加该行,而无需将其用大括号括起来。

在循环结束时,我们可以确认,如果它被分配,则至少有一个 firstName 匹配,但由于循环结束并且没有返回 propfirstName 匹配时不匹配。然后我们可以围绕它来调节错误返回;如果 firstName 匹配,我们通知用户 prop 不匹配,否则 firstName 未找到,我们可以通知用户相反。

关于javascript - FOR 循环内的嵌套 IF 仅适用于第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210876/

相关文章:

javascript - 如何使用 javascript 在表中显示我的 if 语句结果

javascript - bootstrap 使用什么来检查 dropdown.js 中的外部点击?

arrays - Big O分析对字符串数组中的每个字符串进行排序,然后对该字符串数组进行排序

javascript - 在 Mootools 中将对象转换为哈希对象?

javascript - 如何将id,值数组列表转换为[id] :[value] type object

javascript - 使用 Phantom.js 的 Headless Browserify JavaScript 测试

javascript - 突破node.js then()s

java - 使用 while 循环搜索数组中的特定值

c - 如何检查我的数组是否按升序排列?

c++ - 在类中声明 vector 大小