【问题标题】:Separator only between operations仅操作之间的分隔符
【发布时间】:2018-02-02 14:19:53
【问题描述】:

我必须制作乘法表,对于 n = 3,它看起来像这样:

1 x 1 = 1 | 1 x 2 = 2 | 1 x 3 = 3 
2 x 1 = 2 | 2 x 2 = 4 | 2 x 3 = 6 
3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9

现在我的代码如下所示:

var n = 3;
var result;

for (i = 1; i <= n; i++) {
    var result = '';
    for(j = 1; j <= n; j++) {
        result += ` ${i} * ${j} = ${i * j}`;
    }
    console.log(result);
}

我的结果是:

1 x 1 = 1  1 x 2 = 2  1 x 3 = 3 
2 x 1 = 2  2 x 2 = 4  2 x 3 = 6 
3 x 1 = 3  3 x 2 = 6  3 x 3 = 9

我不知道如何添加“|”仅在数学运算之间分开。如果我添加“|”在结果变量的末尾,我也会在最后一次操作后得到它,但我不想要它。

【问题讨论】:

  • 您显示的代码不会打印您显示的结果。您应该有一些代码可以打印出表达式,而不仅仅是结果。然后,如果它不是一行中的最后一个,则只需在每个表达式之后打印一个 `|`。
  • 所以不要为行中的最后一个操作添加分隔符...
  • @sosick 为您添加了一个简单的解决方案,如果有帮助,请告诉我。祝你好运!

标签: javascript loops for-loop


【解决方案1】:

您可以附加 |当它不是最后一行时到最后。

var n = 3;
var result;

for (i = 1; i <= n; i++) {
    var result = '';
    for(j = 1; j <= n; j++) {
        result += ` ${i} * ${j} = ${i * j}`;
        if(j != n)
        {
          result += ' |';
        }
    }
    console.log(result);
}

【讨论】:

    【解决方案2】:

    您可以使用模运算符 % 或仅使用 j != n 添加检查以查看它是否是行中的最后一部分并根据该条件添加 |

    var n = 3;
    var result;
    
    for (i = 1; i <= n; i++) {
      var result = '';
      for (j = 1; j <= n; j++) {
        result += ` ${i} * ${j} = ${i * j}`;
        result += j % n ? ' |' : ''
      }
      console.log(result);
    }

    您可以使用Array.from() 方法和join 来做到这一点。

    var n = 4;
    
    const result = Array.from(Array(n), (e, i) => {
      i += 1
      return Array.from(Array(n), (a, j) => {
        j += 1
        return `${i} * ${j} = ${i * j}` + (j != n ? ' | ' : '')
      }).join('')
    }).join('\n')
    
    console.log(result)

    【讨论】:

      【解决方案3】:

      您可以使用logical AND &amp;&amp; 和字符串添加检查。它返回空字符串或分隔符。

      var n = 3,
          result,
          i, j;
      
      for (i = 1; i <= n; i++) {
          result = '';
          for (j = 1; j <= n; j++) {
              result += result && ' |';
              result += ` ${i} * ${j} = ${i * j}`;
          }
          console.log(result);
      }

      【讨论】:

        【解决方案4】:

        与其将管道添加到每个项目的末尾,不如将它添加到每个项目的开头,除了第一个项目:

        var n = 3;
        var result;
        
        for (i = 1; i <= n; i++) {
            var result = '';
            for(j = 1; j <= n; j++) {
                if(j !== 1)
                {
                  result += ' | ';
                }
                result += `${i} * ${j} = ${i * j}`;
                
            }
            console.log(result);
        }

        【讨论】:

          【解决方案5】:

          我可能会使用一些range 函数(例如range(3, 7) //=&gt; [3, 4, 5, 6, 7])然后在外部和内部范围上使用map,如下所示:

          const range = (b, e) => Array.from({length: e - b + 1}, (_, i) => b + i)
          
          const multTable = (m, n) => range(1, n).map(i => range(1, m).map(
            j => `${i} x ${j} = ${i * j}`
          ).join(' | ')).join('\n')
          
          console.log(multTable(3, 3))

          一旦您的产品或因素达到两位数,这将停止排队。如果这是一个问题,您可以将join(' | ') 替换为join('\t|\t')。它不会是完美的,但它可能会更好。

          【讨论】:

          • 虽然肯定更惯用,但从长远来看,这将是非常低效的,因为新数组是在每个内部循环中从头开始构建的。在现实世界的应用程序中,您最好将range 实现为生成器,但在这种情况下,您还需要拥有mapjoin 和朋友...
          • @georg:我在这里更关心 API 而不是性能,但如果这对于我们想要的乘法规模来说“非常低效”,我会感到非常惊讶桌子。但是如果有问题,我们可以轻松地只创建一次内部范围,只需要稍微不那么干净的代码。
          • 为什么您认为生成器更适合创建固定长度的短数字集合?
          【解决方案6】:

          这样试试

          var n = 3;
          var result;
          
          for (i = 1; i <= n; i++) {
             var result = '';
             for(j = 1; j <= n; j++) {
                if(j!=n)
                   result += ` ${i} * ${j} = ${i * j}` + '|';
                else
                   result += ` ${i} * ${j} = ${i * j}`;
             }
          
          console.log(result);
          }
          

          【讨论】:

            【解决方案7】:

            应该是:

            var n = 3;
            var result = '';
            
            for (i = 1; i <= n; i++) {
                var result = '';
                for(j = 1; j <= n; j++) {
                    result.length && result += '|';
                    result += ` ${i} * ${j} = ${i * j}`;
                }
                console.log(result);
            }
            

            【讨论】:

              【解决方案8】:

              对于所有 n :

              function table(n){
                  var i, j;
                  for (i = 1; i <= n; i++) {
                      var result = '';
                      for(j = 1; j <= n - 1; j++)
                          result += ` ${i} x ${j} = ${i * j} |`;
                      result += ` ${i} x ${j} = ${i * j}`
                      console.log(result);
                  }
              }
              table(1);
              table(2);
              table(3);

              【讨论】:

                【解决方案9】:

                只需使用数组收集结果,然后join| 的部分

                var n = 3;
                var result;
                
                for (let i = 1; i <= n; i++) {
                    result = [];
                    for (let j = 1; j <= n; j++) {
                        result.push(`${i} * ${j} = ${i * j}`);
                    }
                    console.log(result.join(' | '));
                }

                【讨论】:

                  【解决方案10】:

                  另一种方法是删除最后出现的“|”在循环中slice():

                  var n = 3;
                  var result;
                  
                  for (var i = 1; i <= n; i++) {
                    var result = '';
                    for (var j = 1; j <= n; j++) {
                      result += ` ${i} * ${j} = ${i * j} |`;
                    }
                    result = result.slice(0, -1);
                    console.log(result)
                  }

                  【讨论】:

                    【解决方案11】:

                    试试

                    let n =3;
                    [...Array(n)].map((_,i,a)=>
                      console.log(a.map((_,j)=>`${i+1} * ${++j} = ${(i+1)*j}`).join(' | ')));
                    

                    let n =3;
                    [...Array(n)].map((_,i,a)=>console.log(a.map((_,j)=>`${i+1} * ${++j} = ${(i+1)*j}`).join(' | ')));

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-08-31
                      • 1970-01-01
                      • 2021-03-13
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-06-23
                      • 2022-08-15
                      相关资源
                      最近更新 更多