遍历数组并在值为true时绘制*

时间:2018-08-17 08:16:43

标签: javascript arrays

我有一个值为true和false的数组。我想检查数组的值是否为真绘制'*'。每行应向左移动1个位置。

Expected result -> 
'*****
  *****
   *****
    *****
     *****'

我尝试过这种方式。

 let points = [
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false]
];

let m = 10;
let n = 5;
let board = "";
let space = '\xa0';

for(let i = 0; i < points.length; ++i) {
  for(let j = 0; j < points[i].length; ++j) {
      if(points[i][j])  {
        for (let y = 0; y < points[i]; y++) {
          if(y > 0) {
            board += space + "*";
            space += space;
          }
          for (let x  = 0; x <  points[i][j]; x++) {
              board += "*";
          }
          board += "\n";
        }
      }
    return '';
  }
}

4 个答案:

答案 0 :(得分:0)

points
  .map((row, i) => " ".repeat(i) + row.map(cell => (cell ? "*" : " ")).join(""))
  .join("\n");

答案 1 :(得分:0)

您可以使用几个reduce()函数使用索引来控制外部空间和内部循环,以控制初始空间。外部reduce遍历每一行,内部reduce根据布尔值组成*字符串。

let points = [
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false]
];

let result = points.reduce((str, arr, i) => {
  return str 
         + ' '.repeat(i) 
         + arr.reduce((subst, bool) => subst + (bool ? '*' : ''), '') 
         + '\n'
}, '')
console.log(result)

答案 2 :(得分:0)

根据您的描述,如果您要坚持循环,循环应该与此类似。

let points = [
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false],
  [false, true, false, true, false, true, false, true, false, true],
  [true, false, true, false, true, false, true, false, true, false]
];

let board = "";

for (let i = 0; i < points.length; i++) {
  for (let j = 0; j < points[i].length; j++) {
    if (j === 0 && i !== 0) {
      board += "<br>";
      for (let k = 0; k < i; k++) {
        board += "\xa0";
      }
    }
    board += points[i][j] ? "*" : " ";
  }
}

document.write(board);

但是,如果要显示的“预期结果”,则需要删除空格。在这方面,您的预期结果与描述不符。

答案 3 :(得分:0)

我只会使用Array.prototype.map。为了简洁起见,此处的代码使用了当代ES6,但如果需要,可以轻松地移植到ES5。

let points = [
    [true, false, true, false, true, false, true, false, true, false],
    [false, true, false, true, false, true, false, true, false, true],
    [true, false, true, false, true, false, true, false, true, false],
    [false, true, false, true, false, true, false, true, false, true],
    [true, false, true, false, true, false, true, false, true, false]
];

points.map((row, i) => {
    const padded = [];
    while (i--) {
        padded.push(' ');
    }
    return [
        ...padded,
        ...row.map(point => point ? '*' : ' ')
    ].join('');
}).join('\n');

我正在使用:

  • spread operator扩展到填充的页面,并将数组项指向一个新数组,然后将其join放入一个字符串
  • arrow functions () => {}和隐式return语句作为对map的回调函数

输出

Padded string