有人能帮我完成这段代码吗?我正在编写一个函数,它从一个对象中获取一个名称,并返回一个名称标签:“嗨!我是名字,我来自乡下。”。
我试过这段代码
const GUEST_LIST = {
Randy: "Germany",
Karla: "France",
Wendy: "Japan",
Norman: "England",
Sam: "Argentina"
}
function greeting(name) {
var x = Object.keys(GUEST_LIST);
const array = Object.keys(GUEST_LIST)
.map(function(key) {
return GUEST_LIST[key];
});
var txt ="";
for (let i in x)
{
if (name === x[i])
{
txt = "Hi I'm "+x[i] +", and I'm from " +array[i];
}
else
{
txt = "Hi! I'm a guest";
}
}
return txt;
}
console.log(greeting("Randy"))
但是它总是返回“嗨!我是客人”,除非我输入了Sam,
发布于 2021-06-20 00:15:28
您的问题是,即使在从数组中找到与传递给函数的名称匹配的名称之后,for循环仍将继续循环到x
数组中的其他名称上。这意味着在for循环的进一步迭代中,代码的else
块将运行并覆盖以前设置的txt
值。这就是"Sam“工作的原因,因为这是x
数组中的姓,因此txt
不会被for循环的进一步迭代覆盖。
关于您的代码,另一件需要注意的事情是循环不应用于迭代数组。它可能导致不必要的值被访问,因为它不只是遍历数组的索引,而是其他属性。
这么说,你的代码设计过度了。当前,您的对象存储键值对.关键是名称,价值是国家。对于对象中的每个键,可以使用括号表示法访问它。
console.log(GUEST_LIST["Randy"]); // Germany
考虑到这个想法,您的name
变量可以用作对象的键,然后可以用于获取国家。如果GUEST_LIST对象不包含您的键(即:尝试从对象访问键时返回的值为falsy),则可以返回默认的"Hi! I'm a guest"
文本:
const GUEST_LIST = {
Randy: "Germany",
Karla: "France",
Wendy: "Japan",
Norman: "England",
Sam: "Argentina"
};
function greeting(name) {
const country = GUEST_LIST[name];
if(country)
return "Hi I'm "+name +", and I'm from " +country;
else
return "Hi! I'm a guest";
}
console.log(greeting("Randy"));
发布于 2021-06-20 00:26:49
为了理解我的意思,这里是您代码的工作版本。
for (let i in x)
{
if (name === x[i])
{
txt = "Hi I'm "+x[i] +", and I'm from " +array[i];
break; // <---- stop the loop here when you find a match
}
else
{
txt = "Hi! I'm a guest";
}
}
return txt;
}
发布于 2021-06-20 00:34:12
简单易懂,短小:
const GUEST_LIST = {
Randy: "Germany",
Karla: "France",
Wendy: "Japan",
Norman: "England",
Sam: "Argentina"
}
function greeting(name){
return (GUEST_LIST[name]) ?
`Hi, I'm ${name} and I'm from ${GUEST_LIST[name]}` :
`Hi! I'm a guest`
}
console.log(greeting("Randy"))
https://stackoverflow.com/questions/68051601
复制相似问题