0

私は Codecademy の Javascript - Intro to Objects コースを受講しており、現在、「復習: これまでの話...」レッスンの「4. I have toCeleb you baby」演習に取り組んでいます。

演習は次のとおりです。

この演習には、入力するための映画やレビューがたくさんあります。

しかし、これほど多くのケースに対処しなければならないのには理由があります。if-elseステートメントを使用すると非効率になることを示したいと思います。条件付きレッスンのどの代替手段を使用できますか?

映画のコレクションがあり、それぞれにレビューを割り当てるコードを書きたいとします。明らかに、各レビューは映画によって異なります。以下は、映画とあなたのレビューです。前のレッスンで学習した構造を使用して、以下の情報をコードで記述します。

  • 「マトリックス」 - 「いい旅だ」
  • 「プリンセス・ブライド」 - 「最高のデート・ナイト・ムービー」
  • 「アメリカへようこそ」 - 「アムジャドのお気に入り」
  • 「Remember the Titans」 - 「love the sports」
  • 「どうして12歳に見えるの?」- 「ライアンとザックの物語」
  • 「野生のカンガルーとの戦い」 - 「Leng のトークン オーストラリア映画」

getReviewreturn上記の情報に基づいて、映画の名前とそのレビューを取得する関数にする必要があります。映画の名前が見つからない場合は、単に 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 ステートメントをプログラムするよりも、movieReviews 配列を追加、編集、変更する方が簡単だと思います。

つまり、if-else ステートメントと比較して switch ステートメントが非効率的である理由がわかりません。私は何が欠けていますか?

編集: 問題のヘルプ テキストは次のとおりです。

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

すべての映画には一意の名前が付けられるため、キーの完全な候補になります。さらに、レビューの検索に使用される関数は、レビュー オブジェクトのメソッドである必要があります。それが価値があるものについては(そして、うまくいけばそれは何か、たとえ今ではないにしても)、これが私が解決策を実装する方法です.

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

このようにして、各映画のレビューにアクセスするのは簡単で、反復はまったく必要ありません。また、オブジェクト内にデータを含めて、カプセル化を提供し、ユーザーにインターフェイスの使用を強制します。

if-elseあなたの最初の質問に関しては、いくつかの時限テストを実行せずに and orステートメントがより効率的であるかどうかを私が言うのは難しいですswitch(おそらくあなたができることで、私たちに知らせてください!)。しかし、ここに書かれていることを踏まえると、

「複数のケースが指定された値と一致する場合、一致する最初のケースが選択されます...」

とにかく、これはケースを繰り返しているようです。JavaScript 制御構造が現在の JS エンジンでどのように変換されるかによって、switch ステートメントが最適化される可能性があり、大量のオプションを使用する if-else よりも優れたパフォーマンスを発揮すると思います。

パフォーマンスは別として、if-else と比較して、多くの要素を含む switch ステートメントを読むことは非常に優れています。また、問題をより適切に修正するために、オブジェクトの種類 (私の例では配列 -> オブジェクト)などの他の要因を変更できる場合がよくあります。

コードを時期尚早に最適化するという罠にはまらないでください。そうしないと、何も完成せず、あなたの仕事を維持する人々はあなたを永遠に嫌うでしょう。

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

よりクリーンなコードにもなります。

于 2013-02-12T05:06:34.293 に答える