2017-12-04 11 views
0

さまざまな空白文字だけで構成される複数の文字列を作成しようとしています。私は配列でこれを一度行うことができました。(インデックスの数).join( "");array.splitを使用して複数の空白文字列を作成する

しかし、ループに入り、各文字列に空白を増やす文字列を追加すると、文字列は「未定義」に設定されます。私はどこに間違っているのか分からない。この関数はループの外側では動作するように見えますが、内部では動作しません。私が間違って行ったことは何ですか?

上部に

function towerBuilder(nFloors) { 
 
    // build here 
 
    var towers = []; 
 
    var stars = "*"; 
 
    var spaceNo = nFloors -1; 
 
    let spaces = Array(spaceNo).join(" "); 
 
    spaceNo -= 1; 
 
    towers[0] = spaces + stars + spaces; 
 
    for(i = 1; i <= nFloors -1; i++) 
 
    { 
 
     stars = stars + Array(i + 2).join('*'); 
 
     let edges = Array(spaceNo).join(" "); 
 
     towers[i] = edges + stars + edges; 
 
     spaceNo -= 1; 
 
    } 
 
    
 

 
    return towers; 
 
} 
 
console.log(towerBuilder(3));

、これは動作します:

let spaces = Array(spaceNo).join(" "); 

をしかし、ダウンループでは、この出力を '未定義の'

let edges = Array(spaceNo).join(" "); 

考えはということですタワーを配列から構築できるように、スペースはスターシンボルをラップします。たとえば、呼び出しtowerBuilder(3)以下の出力になります(私はキャリッジリターンと出力にそれをする必要はありません配列だけでは十分であろう。。)

[ 
    ' * ', 
    ' *** ', 
    '*****' 
] 
+1

* "ただし、ループの中で、これは 'undefined'を出力します。" *あなたが投稿したコードにはありません。私はそれを取り出してStack Snippetにドロップし、あなたが何を記述しているのかは分かりません。問題を示す[mcve]で質問を更新してください(私が行ったようにStack Snippetsを理想的に使っています; [こちらの情報はこちら](https://meta.stackoverflow.com/questions/358992/ive-been-told-to -do-a-runnable-example-with-stack-snippets-how-do-i-do-tha))。 –

+0

あなたはどんな出力を得ていますか?私は、各行で星の​​周りにスペースを囲むことを期待していますが、私は以下を取得します。 [ "*"、 "***"、 "******" ] –

+0

「未定義」ではありません。あなたの質問は* "これは"未定義 "を出力します*。それはしません。 –

答えて

1

Array.joinは、すべての配列の値を連結するために使用される、とそれらの間の与えられた文字列:

['foo','bar'].join(',') // = 'foo,bar'

次の2つのスペースであることをArray(2).join(' ')を期待しているが、それは、間にスペースを2つの空の値を連結していますので、それが唯一のいずれかになります。

ただ、5行目で-1を削除し、それが期待どおりに動作します:

function towerBuilder(nFloors) { 
 
    // build here 
 
    var towers = []; 
 
    var stars = "*"; 
 
    var spaceNo = nFloors; // was nFloors - 1 
 
    let spaces = Array(spaceNo).join(" "); 
 
    spaceNo -= 1; 
 
    towers[0] = spaces + stars + spaces; 
 
    for(i = 1; i <= nFloors -1; i++) 
 
    { 
 
     stars = stars + Array(i + 2).join('*'); 
 
     let edges = Array(spaceNo).join(" "); 
 
     towers[i] = edges + stars + edges; 
 
     spaceNo -= 1; 
 
    } 
 
    
 

 
    return towers; 
 
} 
 
console.log(towerBuilder(3));
ところで

が、それはかなり良くなり、このように書かれている場合:

function towerBuilder(nFloors) { 
 
    // build here 
 
    var towers = []; 
 
    
 
    for(var floor = 0; floor < nFloors; floor++) 
 
    { 
 
     var nStars = (floor * 2) + 1; 
 
     var stars = Array(nStars + 1).join('*'); 
 
     var edges = Array(nFloors - floor).join(" "); 
 
     towers[floor] = edges + stars + edges; 
 
    } 
 

 
    return towers; 
 
} 
 
console.log(towerBuilder(3));

+0

ありがとうございました!とても有難い! –

関連する問題