谁能告诉我,我在这里做错了什么?
这个函数只返回第一个用户的信息。从来不返回第二个用户的信息。如果两个参数都为真,它应该返回第二个参数的任何值。
var users = [{
"name": "Klara",
"surname": "Johnson",
"color": "Yellow",
"preference": ["Hot", "Double", "Sugar free"]
},
{
"name": "Daenerys",
"surname": "Targaryen",
"color": "Salmon",
"preference": ["Iced", "Single", "Chocolate"]
}
];
function findInfo(name, info) {
for (i = 0; i < users.length; i++) {
if (name === users[i].name) {
if (users[i].hasOwnProperty(info)) {
return users[i][info]
} else {
return "No such info"
}
} else {
return "no such name"
}
}
}
console.log(findInfo('Klara', 'adsf'))
console.log(findInfo('Daenerys', 'color')) //Expected "Salmon", but log "No such name"
console.log(findInfo('Klara', 'color')) // Yellow
因为只要在函数内部遇到返回语句,函数就会返回指定的值并退出函数。在你的例子中,它是在检查 users[i]的名字是否与参数中的名字相同。如果是,它正在检查是否有一个名为 "info "的属性。由于没有info属性,它只是返回 "no property found "并退出函数,而不检查其他用户。你必须先遍历整个数组,如果仍然没有找到用户,才返回 "没有找到用户"。你的代码只检查第一个用户的名字是否等于参数。如果它不等于,你就会在遍历数组的其他元素之前返回 "no such name"。
工作代码。
var users = [{
"name": "Klara",
"surname": "Johnson",
"color": "Yellow",
"preference": ["Hot", "Double", "Sugar free"]
},
{
"name": "Daenerys",
"surname": "Targaryen",
"color": "Salmon",
"preference": ["Iced", "Single", "Chocolate"]
}
];
function findInfo(name, info) {
for (var i = 0; i < users.length; i++) {
if (name === users[i].name) {
if (users[i].hasOwnProperty(info)) {
return users[i][info]
} else {
return "No such info"
}
}
}
//if you reach here that means that you have not found user in entire array
return "no such name";
}
console.log(findInfo('Daenerys', 'asdf'))
那是因为你在for循环中返回的时候 可能是在检查所有元素之前,如果没有找到用户,你应该在循环结束时返回,总之一个更简单的方法是:
function findInfo(name, info) {
const user = users.find(e => e.name === name);
if(!user) return "No such name";
return user.hasOwnProperty(info) && user[info] || "No such info";
}
一旦你从函数中返回,它就不会在下一次迭代中执行。不过你可以这样做
var users = [{
"name": "Klara",
"surname": "Johnson",
"color": "Yellow",
"preference": ["Hot", "Double", "Sugar free"]
},
{
"name": "Daenerys",
"surname": "Targaryen",
"color": "Salmon",
"preference": ["Iced", "Single", "Chocolate"]
}
];
function findInfo(name, info) {
var userFound = "no user found";
var userInfo = "no info";
for (i = 0; i < users.length; i++) {
if (name === users[i].name) {
userFound = users[i].name;
if (users[i].hasOwnProperty(info)) {
userInfo = users[i][info];
break;
}
break;
}
}
return {userFound, userInfo}
}
console.log(findInfo('Klara', 'adsf'));
console.log(findInfo('Daenerys', 'color')) ;
console.log(findInfo('Klara', 'color'));