我正在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 陈述,也执行了。这是为什么。?
答案 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
,因为字符串Kristian
和Akira
不相等,因此您的代码然后记录了名称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
行放在循环之后。