我正在阅读Codecademy的Javascript - Intro to Objects课程,目前我正在“审核:到目前为止的故事......”课程的"4. I have to celebrate you baby" exercise中挂断。
练习是:
这个练习有很多电影和评论要输入。你可以 奇怪,“这是教学编码还是打字?!”
但有一个原因可以解决这么多案件。我们想要 表明如果我们使用
if
-else
语句,则效率低下。 我们可以使用条件课程的其他选择吗?想象一下,你有一个电影收藏,你想写一些代码 将评论分配给每个人。显然每次评论 因电影而异。以下是电影和您的评论。 使用在前一课中学到的结构来编写代码 以下信息:
- “Matrix” - “好旅行”
- “公主新娘” - “令人敬畏的约会之夜电影”
- “欢迎来到美国” - “Amjad的最爱”
- “记住泰坦” - “热爱运动”
- “为什么我看起来像我12岁?” - “瑞安和扎克的故事”
- “在野外战斗袋鼠” - “令人生畏的澳大利亚电影”
getReview
应该是一个获取电影名称和return
的函数 根据上述信息进行审核。如果没有找到电影名称 只需返回"I don't know!"
。
我的理解是将数据与逻辑分开很重要。所以,我最初的解决方案是:
var getReview = function (movie) {
for (var i = 0; i < movieReviews.length; i++) {
if (movie === movieReviews[i].name) {
return(movieReviews[i].review);
}
}
return("I don't know!");
};
var movieReviews = [{name: "Matrix", review:"good trip out"},
{name: "Princess Bride", review:"awesome date night movie"},
{name: "Welcome to America", review:"Amjad's favorite"},
{name: "Remember the Titans", review:"love the sports"},
{name: "Why do I look like I'm 12?", review:"The Ryan and Zach story"},
{name: "Fighting Kangaroos in the wild", review:"Token Australian movie for Leng"}];
console.log(getReview("Matrix"));
我确信有很多方法可以对此进行优化,但总的来说,我认为添加,编辑,修改等电影复制数组比编写switch语句更容易。
换句话说,我没有看到为什么switch语句与if-else语句相比效率低下。我错过了什么?
编辑:问题的帮助文本是:
可以使用if,else if和else语句,但是 效率低下。在您有许多不同场景的情况下 和不同的,尝试使用switch语句!
因为我们正在定义一个函数,所以我们可以使用return 关键字!
确保您返回的内容与评论文字
的大小写相符
答案 0 :(得分:2)
真的,现在的问题是有缺陷的。您正在学习的课程是对象简介,那么为什么这两个数组都没有关联?简单地:
movieReviews = {
"matrix": "a good trip"
}
// These are now both valid for accessing "a good trip"
movieReviews["matrix"];
movieReviews.matrix
每部电影都有一个独特的名称,这使其成为键的完美候选者。此外,用于搜索评论的功能应该是评论对象的方法。对于它的价值(并且希望它是某种东西,即使现在不是),这也是我实现解决方案的方式。
MovieReviews = function() {
/* Private data. */
var data = {
"matrix": "good trip out",
"Princess Bride": "awesome date night movie",
"Welcome to America": "Amjad's favorite"
}
/* Get a review for a movie by name, or notify that we don't know */
this.getReview = function(movie) {
if(data.hasOwnProperty(movie)) { return data[movie]; }
return "I don't know!";
}
/* Add a review by movie name, and review string. */
this.addReview = function(movie, review) {
data[movie] = review;
}
}
现在实例化一个新的MovieReview
对象,添加一个新的电影评论,并打印一些测试。
var reviews = new MovieReviews();
reviews.addReview("Remember the Titans", "love the sports");
console.log(reviews.getReview("matrix")); // 'good trip out'
console.log(reviews.getReview("Remember the Titans")); // 'love the sports'
console.log(reviews.getReview("A Scanner Darkly")); // 'I don't know!'
这样访问每部电影的评论都是微不足道的,根本不需要迭代。您还在对象中包含数据,提供封装并强制用户使用您的接口。
至于你原来的问题,我很难说如果没有进行一些定时测试({@ 1}}或if-else
语句更有效率(也许你可以做的事情让我们知道!) 。但基于所写的here,
“如果多个案例与提供的值匹配,则选择匹配的第一个案例......”
这似乎只是在迭代案例中。如何使用当前的JS引擎转换JavaScript控件结构可能会优化您的switch语句,我敢打赌它在if-else上使用大量选项的性能会更好。
除了性能之外,与if-else相比,读取具有许多元素的switch语句非常好 。此外,通常有时候您可以更改其他因素,例如对象类型( array - &gt; in example in example ),以便更好地解决问题。
不要陷入过早优化代码的陷阱,否则你永远不会完成任何事情,维护你工作的人会永远和你永远地恨你。
答案 1 :(得分:0)
您将所有内容存储在一个数组中,只需使用case / switch就可以运行循环。您可以通过多种不同的方式完成此任务,但如果使用大小写/切换而不是大量的条件,则可以使用较少的字符。
function movieReviews(movie) {
var x = "No review.";
switch (movie)
{
case 'Matrix':
x="good trip out";
break;
case 'Princess Bride':
x="awesome date night movie";
break;
case 'Remember the Titans':
x="love the sports";
break;
case 'Welcome to America':
x="Amjad's favorite";
break;
default:
x="No movie selected.";
}
document.write("Movie: " + movie + " Review: " + x);
}
它也使代码更清晰。
答案 2 :(得分:0)
尝试以下方法:
var getReview = function (movie) {
switch (movie) {
case 'Matrix': return "good trip out";
break;
case 'Princess Bride': return "awesome date night movie";
break;
case 'Welcome to America': return "Amjad's favorite";
break;
case 'Remember the Titans': return "love the sports";
break;
case 'Why do I look like I\'m 12?': return "The Ryan and Zach Story";
break;
case "Fighting Kangaroos in the wild": return "TOken Australian movie for Leng";
break;
default: return "I don't know!"
break;
}
};