2013-02-12 45 views
0

我正在閱讀Codecademy的Javascript - Intro to Objects課程,並且我目前掛在了「回顧:迄今爲止的故事......」課程中的"4. I have to celebrate you baby" exerciseJavascript switch與if/else

的運動是:

這項工作有很多電影和評論中鍵入你可能 納悶,「這是教學的編碼或打字?」

但是有這麼多案件需要處理的原因。我們希望 表明如果我們使用if - else陳述,這將是低效的。 我們可以使用什麼替代條件課?

想象一下,你有一個電影收藏,你想寫一些代碼 分配您的評論給他們每個人。顯然每個評論 因電影而異。以下是電影和您的評論。 使用的結構在前面的經驗教訓寫代碼如下 信息:

  • 「黑客帝國」 - 「好出去一趟」
  • 「公主新娘」 - 「真棒約會之夜電影」
  • 「歡迎來到美國」 - 「Amjad最喜歡的」
  • 「記住泰坦」 - 「愛運動」
  • 「爲什麼我看起來像我12? - 「在瑞安和扎克的故事」
  • 「在野外戰鬥袋鼠」 - 「爲冷令牌的澳洲電影」

getReview應該是一個函數,它接受一個電影的名字和return S是其 綜述基於上面的信息。如果給定電影名稱未找到 只是返回"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語句與if-else語句相比效率低下。我錯過了什麼?

編輯:該問題的說明文字是:

這是可能的,如果使用,否則,如果和else語句,但是這是 效率低下。在有許多不同場景 和不同的情況下,請嘗試使用switch語句!

因爲我們正在定義一個函數,所以我們可以利用返回關鍵字 !

請確保您返回什麼評論文章

+2

我真的不明白你的問題..你似乎沒有使用'switch' – 2013-02-12 04:48:00

+0

練習的重點不在於使用switch語句。有人問,有沒有更好的辦法。你的getReview方法是邁向它的好的第一步。而不是寫類似的: '如果(==電影 「黑客帝國」) //做一些 否則,如果(電影== 「公主新娘」) //做別的事情 // ....' 您正在通過數組循環查找答案。比上面寫的方法糟糕的'if/else'方法更少的代碼。 現在,有沒有更好的方式來找到名稱而不是數組? – 2013-02-12 04:53:28

+0

@RobDiMarco Marco - 我確定有更多最佳的方法來找到名字(我不確定他們現在是什麼,但我確定他們存在;-)。我只是沒有看到switch語句比給定場景的if/then更好。 – 2013-02-12 04:58:16

回答

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

通過這種方式訪問​​您的每部電影的評論是微不足道的,並且根本不需要迭代。您還將數據包含在對象中,提供封裝並強制用戶使用您的接口。

至於你的原始問題,我很難說如果沒有執行一些定時測試(也許你可以做並讓我們知道!),陳述是否更高效。但是根據什麼寫here

「如果多例符合規定值,則選擇第一個匹配的情況下......」

這似乎是它只是通過個案迭代反正。如何將JavaScript控制結構與您當前的JS引擎一起轉換,可能會優化您的switch語句,我敢打賭,如果使用大量選項,if-else會更好。

不考慮性能,它是很好的閱讀一個switch語句,它有很多元素,與if-else相比。此外,您經常可以更改其他因素,例如對象類型(陣列 - >我的示例中的對象),以更好地解決問題。

不要陷入過早優化代碼的陷阱,否則你永遠無法完成任何事情,維護你的工作的人會永遠恨你,永遠。

+0

謝謝!我認爲有一些方法可以將電影名稱用作關鍵字,但尚未能夠解決語法問題。它看起來像你的帖子的末尾被切斷。你打算在封裝上多說一點嗎?從課程的角度來看,if語句和then語句之間是否有任何性能優勢? – 2013-02-12 05:38:21

+0

@RecursiveSelfOptimization - 對不起,忘了完成!最後在性能優勢方面增加了一點。 – Aesthete 2013-02-12 06:03:53

+0

感謝您提供這樣一個完整的答案,不僅解決了我的主要問題,而且還提供了一個可理解的步驟,以更優化的選擇。 RE:「不要陷入過早優化你的代碼的陷阱,否則你將永遠得不到任何東西......」我們以前見過嗎? RE:「......執行一些定時測試(也許你可以做些什麼......」我還沒有,但它在我的待辦事項清單上。 – 2013-02-13 03:40:52

0

你在陣列中存儲的一切,運行循環時,你可以只使用情況/開關的情況相匹配。您可以通過許多不同的方式完成此任務,但如果使用案例/開關而不是大量的條件,則將使用較少的字符。

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); 
} 

它也使得代碼更清晰。

+0

循環中是否存在一些性能問題?具體而言,如果Matrix是數組或switch語句中的第一個條目,則將其與條件進行比較,設置審閱值,並且if/then或那麼在開關語句中沒有出現與循環相關的一些處理開銷,並且字符計數真的是那麼多的開銷? 而對於「更乾淨的代碼」,數組看起來比較乾淨眼睛;更不用說它並沒有被所有的「案例」,「突破」和新的線條所打破,但也許這只是新手的眼睛 – 2013-02-12 05:27:05

+0

這是一個尺寸問題,你的陣列擁有所有的電影和我的開關/大小寫只在條件滿足時才賦值給變量,你的循環正在檢查長度,數組中不同部分的值,我的case/switch沒有這樣做,這是性能問題嗎? FO一個小規模的操作?不是。它是客戶端,但是如果您擁有10,000行代碼的大型應用程序,那麼每次性能的提升都會產生巨大差異。 – Dan88 2013-02-12 05:45:33

+0

感謝您提供切換if/than的一些獨特性能優勢!我認爲Esthete提供了一個更徹底的答案,所以我給了他正確的印記。如果我得到足夠的積分來投票你的答案,我會的,因爲它仍然有幫助。 – 2013-02-13 03:44:14

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