我试图创建几个仅包含不同数量的空格的字符串。我已经能够使用array。(indexs).join(“”);

但是,当我进入一个循环以添加更多字符串且每个字符串中的空格数量逐渐增加时,该字符串将设置为“未定义”。我不确定我要去哪里错。该函数似乎在循环外起作用,但在内部不起作用。有任何想法我做错了吗?



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(" ");


但是,在循环中,此输出为“ undefined”

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


这个想法是,空间包裹着星形符号,以便可以从阵列中构建塔。例如,调用towerBuilder(3)将输出以下内容(我不需要将其与回车符一起输出。仅靠数组就足够了。)

[
  '  *  ',
  ' *** ',
  '*****'
]

最佳答案

Array.join用于连接所有数组的值,并在它们之间使用给定的字符串:

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

您期望Array(2).join(' ')是两个空格,但是它只会是一个空格,因为它是将两个空值连接在一起,中间有一个空格。

只需删除第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));

09-11 17:46
查看更多