0

我正在学习 Codecademy 的 Javascript - Intro to Objects 课程,目前正在“回顾:迄今为止的故事......”课程中的“4。我必须庆祝你的宝贝”练习。

练习是:

这个练习有很多电影和评论可以输入。你可能会想,“这是教编码还是打字?!”

但是有这么多案件需要处理是有原因的。我们想表明,如果我们使用if-else语句,它会是低效的。我们可以使用条件课程的什么替代方法?

想象一下,您有一个电影收藏,并且您想编写一些代码,将您的评论分配给每个电影。显然,每个评论都因电影而异。以下是电影和您的评论。使用在前面课程中学习的结构编写代码以获取以下信息:

  • 《黑客帝国》——《出游好去处》
  • “公主新娘”-“很棒的约会之夜电影”
  • “欢迎来到美国” - “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"));

我确信有办法对此进行优化,但总的来说,我认为添加、编辑、修改等movieReviews 数组比编写switch 语句更容易。

换句话说,我不明白为什么 switch 语句与 if-else 语句相比效率低下。我错过了什么?

编辑:问题的帮助文本是:

可以使用 if、else if 和 else 语句,但效率低下。在你有很多不同的场景和不同的场景的情况下,尝试使用 switch 语句!

因为我们正在定义一个函数,所以我们可以使用 return 关键字!

确保您返回的内容与评论文本的大小写相符

4

3 回答 3

2

确实,目前的问题是有缺陷的。您正在学习的课程是“对象简介”,那么为什么两者都使用非关联数组?简单地:

movieReviews = { 
  "matrix": "a good trip"
}
// These are now both valid for accessing "a good trip"
movieReviews["matrix"];
movieReviews.matrix

每部电影都将有一个唯一的名称,这使其成为key的完美候选者。此外,用于搜索评论的函数应该是评论对象的方法。对于它的价值(希望它是一些东西,即使现在不是),这就是我实施解决方案的方式。

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!'

通过这种方式访问​​您对每部电影的评论是微不足道的,并且根本不需要迭代。您还将数据包含在对象中,提供封装并强制用户使用您的接口。

至于您最初的问题,我很难说如果不执行一些定时测试,and if-elseorswitch语句是否会更有效(也许您可以做一些事情并让我们知道!)。但根据这里写的,

“如果多个案例与提供的值匹配,则选择第一个匹配的案例......”

无论如何,这似乎只是在遍历这些案例。JavaScript 控制结构如何与您当前的 JS 引擎一起翻译可能会优化您的 switch 语句,我敢打赌它比 if-else 具有大量选项的性能更好。

抛开性能不谈,与 if-else 相比,阅读具有许多元素的 switch 语句非常好。此外,有时您可以更改其他因素,例如对象类型(在我的示例中为数组 -> 对象),以更好地解决问题。

不要陷入过早优化代码的陷阱,否则你将永远无法完成任何事情,维护你工作的人会永远恨你。

于 2013-02-12T05:34:35.450 回答
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);
}

它也使代码更清晰。

于 2013-02-12T05:06:34.293 回答
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;
    }
};
于 2013-06-30T19:57:40.577 回答