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
,因为字符串 Kristian
和 Akira
不相等,因此您的代码随后记录名称 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
,我们没有找到联系人。但是,由于您的函数 return
s 在找到联系人时,如果找不到联系人,它只会到达循环下方的任何代码。所以你可以把行 console.log('No such contact');
放在循环之后。
我正在 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
,因为字符串 Kristian
和 Akira
不相等,因此您的代码随后记录名称 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
,我们没有找到联系人。但是,由于您的函数 return
s 在找到联系人时,如果找不到联系人,它只会到达循环下方的任何代码。所以你可以把行 console.log('No such contact');
放在循环之后。