If-condition 跳转到 else-if 语句,即使 if-condition 为真

If-condition jumps to else-if statement, even though the if-condition is true

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

我面临的问题是 in the first picture if 语句比较 name === contacts[i][prop]contacts 是我正在循环的对象所在的数组的名称) returns 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');

这是第二张图片的代码片段。这里唯一改变的是第一个 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 语句。这是为什么。?

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

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');

最终,如评论中所述,问题如下:

Why does the else-if statement gets executed and not the if-statement, even t[h]ough the if-statement is still true?

答案是因为 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 和然后 returns 来自函数。

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

the given property (prop) is a property of that contact.

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

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

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