Javascript切换与if / else

时间:2013-02-12 04:46:22

标签: javascript performance

我正在阅读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   关键字!

     

确保您返回的内容与评论文字

的大小写相符

3 个答案:

答案 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;
    }
};