即使if条件为true,{if条件也会跳至else-if语句

时间:2020-05-17 13:51:57

标签: javascript arrays loops object nested-loops

我正在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');

这是第二张图片中的代码片段。唯一更改的是第一条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,,则第一个else-if 语句将即使我完全没有更改 if 陈述,也执行了。这是为什么。?

2 个答案:

答案 0 :(得分:0)

我建议您仔细阅读以下官方文档。这些将使我们的代码更简单,我们的生活也更容易。

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

答案 1 :(得分:0)

最终,正如评论中所阐明的,问题如下:

为什么即使if语句仍然为true,否则else-if语句也会执行,而if-statement不会执行?

答案是因为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] && contacts[i]name === contacts[i][prop]。我不确定为什么在contacts[i]之后有条件&&:这将检查contacts[i]是否真实,但是contacts[i]是一个对象,所以永远不会虚假。您的部分任务是检查

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

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

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

一种执行此操作的方法是引入一个变量lookupProfile,该变量记录是否找到了联系人。在循环之前,我们将其设置为found。找到联系人后,将其设置为false。如果我们到达循环的结尾,并且true仍然是found,则找不到联系人。但是,由于函数false在找到联系人时就起作用了,因此只有在找不到联系人的情况下,它才会到达循环下方的任何代码。因此,您可以将return行放在循环之后。