【问题标题】:Combine 10 cycles into one in Javascript在 Javascript 中将 10 个循环合二为一
【发布时间】:2018-09-18 17:01:14
【问题描述】:

这是我的循环代码,我想让它更短(如果可能,在一个循环中)。

 function plan(piece) {

        for (i = 0; i < 10; i++) {
            piece.addStep('right');
        }
        for (i = 0; i < 9; i++) {
            piece.addStep('down');
        }
        for (i = 0; i < 8; i++) {
            piece.addStep('left');
        }
        for (i = 0; i < 7; i++) {
            piece.addStep('up');
        }
    }

等...到我

我想过那个案子,

   function plan(piece) {
     for (i=10; i>1; i--){ 
         piece.addStep('right');
         piece.addStep('down');
         piece.addStep('left');
         piece.addStep('up');
     }

但这是错误的。请帮忙!

这是任务(迷宫)的样子

【问题讨论】:

  • 顺序重要吗? piece.addStep('right'); piece.addStep('right'); piece.addStep('down');piece.addStep('right'); piece.addStep('down'); piece.addStep('right'); 一样吗?
  • 你想调用piece.addSteps('right') 10 次piece.addSteps('down') 9 次等等?顺序对你来说重要吗?
  • 所以你想让piece.addStep('right'); 被执行10 次,piece.addStep('down'); 9 次等等?
  • 是作业吗?
  • 这不是问题(它很可能是 next 问题),但是:该代码正在成为The Horror of Implicit Globals 的牺牲品(这是我贫血的帖子小博客)。在适当的范围内声明您的变量。在松散模式下不声明它们会使它们成为全局变量。

标签: javascript cycle


【解决方案1】:

您可以为重复逻辑添加功能:

function addSteps(piece, n) {
    while (n--) {
        piece.addStep(piece);
    }
}

addSteps('right', 10);
addSteps('down', 9);
addSteps('left', 8);
addSteps('up', 7);

【讨论】:

  • 我喜欢这个答案,因为它比只适用于这个特定螺旋的嵌套循环更通用。
【解决方案2】:

通过引入一些 if 检查来简单地组合所有这些。

例如:

function plan(piece) {

        for (i = 0; i < 10; i++) {
            piece.addStep('right');
            if(i < 9)
              piece.addStep('down');
            if(i < 8)
              piece.addStep('left');
            if(i < 7)
              piece.addStep('up');
        }
 }

【讨论】:

  • 谢谢,但它仍然会是很多代码字符串。如何让它更短?自动递减?
  • @MR 除非你在打代码,否则它真的不需要更小。如果它被做得更小,它将很难阅读。首先为人类写作,其次为机器写作 :)
  • @MR 肯定有更好的方法来做到这一点,发布此解决方案是为了使其更具可读性和可理解性,并尽可能降低复杂性,:-)
【解决方案3】:

一个选项是:

function plan(piece) {
   ['right', 'down', 'left', 'up'].forEach((dir, ind) => {
      for (let i = 0; i < 10 - ind; i++) {
         piece.addStep(dir);
      }
   });
}

【讨论】:

  • 最好的办法。
【解决方案4】:

怀疑效率不高,不过可以是Array fill, concat, and forEach

var steps = [].concat(Array(10).fill("right"), Array(9).fill("down"), Array(8).fill("left"), Array(7).fill("up"))
steps.forEach(dir => piece.addStep(dir));

【讨论】:

    【解决方案5】:

    您可以采用嵌套循环并增加索引以获得正确的方向。

    var sequence = ['right', 'down', 'left', 'up'],
         i, j,
         k = 0,
         l = sequence.length;
    
    for (i = 0; i < 10; i++) {
        for (j = i; j < 10; j++) {
            document.getElementById('out').innerHTML += sequence[k] + '\n';
            // or piece.addStep(sequence[k]);
        }
        ++k;
        k %= l;
    }
    &lt;pre id="out"&gt;&lt;/pre&gt;

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多