2017-02-15 14 views
-1

私はforループを利用するコードワードのチャレンジ(ここではhttps://www.codewars.com/kata/ten-green-bottles)に取り組んでいます。私はまだコードを編集していますが、どれほど変更しても、それはcharAtのエラーが続いています。私のコードはここにある:グリーンボトル10個 - charAtエラー

function tenGreenBottles(n) { 
 
    var numbers = [ 
 
    "One", 
 
    "Two", 
 
    "Three", 
 
    "Four", 
 
    "Five", 
 
    "Six", 
 
    "Seven", 
 
    "Eight", 
 
    "Nine", 
 
    "Ten" 
 
    ]; 
 
    var lyrics = ""; 
 
    for (i = n - 1; i > -1; i--) { 
 
    var numberLine = numbers[i] + " green bottles hanging on the wall,\n"; 
 
    var nextNumber = numbers[i - 1].charAt(0).toLowerCase() + numbers[i - 1].slice(1, numbers[i - 1].length); 
 
    if (i < 9) { 
 
     lyrics = lyrics + numberLine + numberLine + "And if one green bottle should accidentally fall,\n" + "There'll be " + nextNumber + " green bottles hanging on the wall.\n"; 
 
    } 
 
    else { 
 
     lyrics = lyrics + "One green bottle hanging on the wall,\n" + "One green bottle hanging on the wall,\n" + "If that one green bottle should accidentally fall,\n" + "There'll be no green bottles hanging on the wall."; 
 
    } 
 
    } 
 
    return lyrics; 
 
}

答えて

1

i

var nextNumber = numbers[i - 1].charAt(0).toLowerCase() ... 

が問題になります行を0に達すると

0

それはあなたの.charAt()エラーがの最後の反復にポップアップ表示されます表示されますループ。この時点ではi = 0なので、numbers[i -1]は配列の-1位の項目にアクセスしようとしています。これは明らかに存在しないので、javascriptは "未定義"とみなし、.charAt()は失敗します。

また

、(ライン18で)テスト:i < 9、歌詞に結果は伝統的に、関数のパラメータn >= 10場合には、曲の最後の行として保持されているものとを開始し、その他の場合は、それ完全に省略される。

最後に、関数パラメータnとして10を超える値を入力すると、関数が悲惨に失敗します。

提案:forループを次のように変更します。実行中の行と最終行で区別するためのテストは、0より大きい数値の位置をテストするように変更され(最終数値は位置0にあります)、テキスト構築用のものは、制御文内に移動されて、最終的な数字の位置を処理しながら実行します。

for (i = n - 1; i > -1; i--) 
{ 
    if (i > 0) 
    { 
     // since i > 0, [i - 1] will always be >= 0. 
     var numberLine = numbers[i] + " green bottles hanging on the wall,\n"; 
     var nextNumber = numbers[i - 1].charAt(0).toLowerCase() + numbers[i - 1].slice(1, numbers[i - 1].length); 

     lyrics = lyrics + numberLine + numberLine + "And if one green bottle should accidentally fall,\n" + "There'll be " + nextNumber + " green bottles hanging on the wall.\n"; 

    } 
    else 
    { 

     // We only want this when i == 0, but from the limitation 
     // set on the for loop (i.e. i > -1)we can assume that 
     // i will never be < 0. 

     lyrics = lyrics + 
      "One green bottle hanging on the wall,\n" + 
      "One green bottle hanging on the wall,\n" + 
      "If that one green bottle should accidentally fall,\n" + 
      "There'll be no green bottles hanging on the wall."; 
    } 
} 

-S

関連する問題