【问题标题】:If-condition jumps to else-if statement, even though the if-condition is trueif-condition 跳转到 else-if 语句,即使 if-condition 为真
【发布时间】:2020-05-17 13:51:57
【问题描述】:

我正在参加 FreeCodeCamp 的挑战。 我的目标是检查 name 是否是实际联系人的 firstName 并且给定的属性 (prop) 是该联系人的属性。

我面临的问题是in the first picture if 语句比较name === contacts[i][prop]contacts 是我循环遍历的对象所在的数组的名称) 返回 true 并且名称被记录,所以一切都很好。 还要注意这里:第一个 else-if 语句比较 name === contacts[i][prop],这在第二张图片中发生了变化。

这是第一张图片的代码:

// Setup
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 (i = 0; i < contacts.length; i++) {
    if (name === contacts[i][prop] && contacts[i]) {
      console.log(name);
      return;
    } else if (name === contacts[i][prop]) {
      console.log(name);
      console.log('No such contact');
      return;
    }
  }
}


lookUpProfile('Kristian', 'firstName');

这是第二张图片中的代码-sn-p。这里唯一改变的是第一个 else-if 语句,我将 name === contacts[i][prop] 更改为 name !== contacts[i][prop]

function lookUpProfile(name, prop) {
  for (i = 0; i < contacts.length; i++) {
    if (name === contacts[i][prop] && contacts[i]) {
      console.log(name);
      return;
    } else if (name !== contacts[i][prop]) {
      console.log(name);
      console.log('No such contact');
      return;
    }
  }
}

但是,如果我将第一个 else-if 语句更改为 name !== contacts[i][prop],如您所见 in the second picture,first else-if 语句将被执行,即使如此我根本没有更改 if 语句。这是为什么。?

【问题讨论】:

  • 请勿发图,请将代码贴在这里。
  • 您好,欢迎来到 Stack Overflow。恐怕我真的很难理解你的问题。您更改了第一行 else-if 中的条件,因此它后面的块现在可能在以前可能没有执行过的情况下执行,这似乎是合理的。你能澄清一下你遇到的问题吗?尝试添加一些示例,说明您的函数应为各种输入值记录到控制台的内容以及它们当前记录的内容。
  • @LukeWoodward 嘿,我目前正在理解 if 语句,如果条件 name === contacts[i][prop] &amp;&amp; contacts[i] 为真,if 条件应该将名称记录到控制台。我不明白的是,为什么第一个 else-if 语句会被执行,即使 if 语句仍然是正确的。为什么第一个 else-if-statement 会被执行,即使 if-statement 仍然是正确的?
  • 对不起,我把自己说得太糟糕了,我的问题是:如果我在 else-if 语句中有条件name === contacts[i][prop],则执行 if 语句。但是如果我将条件更改为name !== contacts[i][prop],else-if 语句就会被执行。为什么执行 else-if 语句而不是 if 语句,即使很难 if 语句仍然正确?

标签: javascript arrays loops object nested-loops


【解决方案1】:

最终,正如 cmets 所阐明的,问题如下:

为什么执行 else-if 语句而不是 if 语句,即使 if 语句仍然为真?

答案是因为if-语句仅在i = 3 时为真,而else-if 语句在i = 0 时为真。

在您的第二个 lookupProfile 函数中循环的第一次迭代中,i 将为零。条件name === contacts[i][prop] 的计算结果为false,因为左侧是Kristian,右侧是Akira。所以if块被跳过,代码跳转到else if,在那里它检查条件name !== contacts[i][prop]。此条件的计算结果为true,因为字符串KristianAkira 不相等,因此您的代码会记录名称Kristian,然后是文本No such contact,然后从函数返回。

使用lookupProfile 函数的第一个版本,您有条件name === contacts[i][prop] &amp;&amp; contacts[i]name === contacts[i][prop]。我不确定你为什么在&amp;&amp; 之后有条件contacts[i]:这将检查contacts[i] 是否为真,但contacts[i] 是一个对象,所以永远不会是假的。你的部分任务是检查

给定的属性 (prop) 是该联系人的属性。

contacts[i] 不会这样做,因为它不涉及prop。由于contacts[i] 始终为true,因此条件name === contacts[i][prop] &amp;&amp; contacts[i] 等价于name === contacts[i][prop],这意味着lookupProfile 的第一个版本中的else if 永远不会执行。

如果联系人在列表中,则函数的第一个版本运行良好。你似乎已经开始工作了。但是,您似乎想要处理联系人不在列表中的情况,但您没有完全正确的逻辑。您不能说如果联系人不匹配 one 的姓名,则该联系人不在列表中:相反,如果他们不匹配 ,则他们不在列表中所有的名字。您只能通过查看整个列表来确定某个联系人不在列表中。

这样做的一种方法是引入一个变量found,例如,它记录是否找到了联系人。在循环之前,我们将其设置为false。找到联系人后,将其设置为true。如果我们到达循环的末尾并且found 仍然是false,我们没有找到联系人。但是,由于您的函数returns 在找到联系人时,它只会在未找到联系人时到达循环下方的任何代码。所以你可以把console.log('No such contact');放在循环之后。

【讨论】:

    【解决方案2】:

    我建议您阅读以下官方文档。这些将使我们的代码变得简单,让我们的生活变得轻松。

    1.Array

    2.Object

        // Setup
        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 ) {
          let Key =contacts[0].hasOwnProperty(prop);
          if(!Key){
            console.log('Property is not found');
            return;
          }
          
          let data = contacts.find(item => name === item[prop]);
          if(data){
             console.log('Matched')
          }else{
    		console.log('Not Matched')
          }
        }
    
        lookUpProfile('Kristian', 'firstName');
        lookUpProfile('Kristian', 'lastName');
        lookUpProfile('Laine', 'lastName');
        lookUpProfile('Laine', 'last');

    【讨论】: