说我有一个对象数组:
var contacts = [
{
"firstName": "Akira",
"lastName": "Laine",
"number": "0543236543",
},
{
"firstName": "Harry",
"lastName": "Potter",
"number": "0994372684",
"likes": ["Hogwarts", "Magic", "Hagrid"]
}
]
我正在尝试遍历对象中的键和值
我尝试使用for循环
function checker (name){
name = "";
for(i = 0; i < contacts.length; i++){
if(name === (contacts[i].firstName)){
return "yes" ;
}
else{
return "No such Contact";
}
}
}
checker("Harry");
使用参数“ Harry”调用该函数应该为true并返回“ yes”,而是返回“ No such contact”!
答案 0 :(得分:1)
正如@Nicholas Tower指出的那样,您正在用返回值中断循环执行。
当您有一系列对象时,请尝试
contacts.find(contact => contact.name === nameYoureLookingFor)
Array.prototype.find()将为您提供第一个与条件匹配的元素。在这种情况下,对象必须包含具有给定值的属性名称。 一个对象是一个真实值,因此您可以在这里使用单线
function checker(name){
return contacts.find(contact => contact.name === name) ? 'yes':'No such Contact';
}
答案 1 :(得分:0)
name = "";
您正在将名称重新分配给""
,而不是使用函数的输入值。
您基本上是在比较
"" === contacts[i].firstName
,它将始终根据您的输入数据使用else
语句。
答案 2 :(得分:0)
尝试一下:
var checker = (name) => {
contacts.forEach(item => {
if(item.firstName === name){
return console.log('Yes');
}else{
return 'No Match found'
}
})
}
答案 3 :(得分:0)
有很多方法可以做到这一点。正如@Nicholas Tower所说,在您的示例中,只需将else返回移到循环外即可解决:
function checker(name) {
for (let i = 0; i < contacts.length; i++) {
if(name === (contacts[i].firstName)){ return "yes" ; }
}
return "No such Contact";
}
checker("Harry");
您可以使用for..of循环以更简洁的方式实现相同目的:
function checker(name) {
for (let contact of contacts) {
if (name === contact.firstName) { return "yes" ; }
}
return "No such Contact";
}
checker("Harry");
...或发现:
function checker (name){
// will return the object if it exists, undefined if not
const contact = contacts.find((contact) => contact.firstName === name);
// convert to a boolean and return the 'yes' if truthy (the object), 'No such Contact' if falsy (the undefined)
return !!contact ? 'yes' : 'No such Contact';
}
checker("Harry");