【问题标题】:Increase and decrease a variable until a number is reached in Javascript增加和减少一个变量,直到在 Javascript 中达到一个数字
【发布时间】:2011-03-31 07:33:24
【问题描述】:

如何在 Javascript 中增加和减少一个变量直到 100,当达到 100 时它应该开始减少。

所以accuracyBarValue应该从0开始,增加到100,当达到100时应该到0,然后重复过程。

以 10 为间隔。

我在一个非常简单的 JS 游戏中使用它,这个值用于增加和减少 PowerBar。

【问题讨论】:

    标签: javascript loops variables


    【解决方案1】:

    这是另一种看法:

    var up = true;
    var value = 0;
    var increment = 10;
    var ceiling = 100;
    
    function PerformCalc() {
      if (up == true && value <= ceiling) {
        value += increment
    
        if (value == ceiling) {
          up = false;
        }
      } else {
          up = false
          value -= increment;
    
          if (value == 0) {
            up = true;
          }
      }
    
      document.getElementById('counter').innerHTML = 'Value: ' + value + '<br />';
    }
    setInterval(PerformCalc, 1000);
    &lt;div id="counter"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案2】:
      for (var i=0;i<100;i++)
      {
      document.write("The number is " + i);
      document.write("<br />");
      }
      while (i>0)
      {
          i -= 10;
          document.write("The number is " + i);
          document.write("<br />");
      }
      

      您可以测试和修改它here

      【讨论】:

      • 如果你也增加 10,在 for 循环中应该是:i+=10 如:for(var i=0;i
      【解决方案3】:

      代码

      let i = 100;
      setInterval(() => {
        console.log(Math.abs((i+=10)%200 - 100))
      }, 1000);
      

      解构

      1. i+=10i 每跳一次无限增加 10
      2. %100 → 最大值的两倍的模(除法剩余前。10 % 6 = 4
      3. - 100 → 删除范围(因此数字将始终介于 100 和 -100 之间,否则将介于 0 和 6 之间)
      4. Math.abs() → 删除 - (确保数字从 0 移动到 100 并返回)

      步骤可视化

      i++

      ∞       .
             .
            .
           /
          /
         / 
        /
      0
      

      (i+=10)%200

      200 
           /    /    /    .
          /    /    /    .
         /    /    /    .
        /    /    /    /
       /    /    /    /
      0
      

      i++%200-100

      100 
        \        /\        /\
         \      /  \      /  \
      0   \    /    \    /    .
           \  /      \  /      .
            \/        \/        .
      -100
      

      Math.abs(i++%200-100)

      100 
        \    /\    /.
         \  /  \  /  .
          \/    \/    .
      0
      

      实施示例

      const max = 10;
      
      let i = max;
      const $body = document.querySelector('body');
      
      setInterval(() => {
        const val = Math.abs(i++%(max * 2) - max);
        const $el = document.createElement('i');
        $el.style = `--i: ${i}; --val: ${val}`;
        $body.appendChild($el);
        window.scrollTo(window.innerWidth, 0);
        console.log(val);
      
      }, 200);
      i {
        --i: 0;
        --val: 0;
        --size: 10px;
        
        position: absolute;
        background: black;
        width: var(--size);
        height: var(--size); 
        top: var(--size);
        left: calc(-10 * var(--size));
        transform: translate(
          calc(var(--i) * var(--size)),
          calc(var(--val) * var(--size))
        )
      }

      替代方法(基于浮点数)

      Math.acos(Math.cos(i * Math.PI)) / Math.PI;
      

      
      Math.abs(i - Math.floor(i) - .5);
      

      其中ifloat 之间的0 - Infinity。结果也是float,需要乘以最大值并四舍五入(目标值)。

      【讨论】:

      • 这真的很有用。我一直在网上搜索这些公式,几乎不可能想出一个搜索短语来到达这里。感谢您花时间发布这些内容。
      • @pbarney 让我知道您搜索的内容,以便我稍微修改一下答案
      • 我很难说,因为我使用起始页进行搜索,它执行的是 POST 而不是 GET,所以我的历史记录没有显示我搜索的内容。可能类似于“增加一个数字直到达到某个限制然后重新启动的公式”。非常笨拙。我想后来我在寻找“增量循环”或类似的东西,这让我来到了这里。
      【解决方案4】:
      var i = 0;
      while( i < 100 )
      {
          i++;
      }
      
      while( i > -1 )
      {
          i--;
      }
      

      显然,您还可以在 while 循环中执行其他代码。

      【讨论】:

      • 嗯,就是加1。应该是i++,而不是i+=10;
      【解决方案5】:

      使用持续时间和帧速率。

      另一种允许您指定持续时间和帧速率的方法。对于动画和一段时间内发生的事情非常有用。

      HTML

      <h2>Increment Value over a Duration with a given framerate</h2>
      Value: <span id="value">0</span>
      

      JavaScript

      var valueElement = document.getElementById('value');
      
      var start     = 0;
      var end       = 100;
      var duration  = 10000; // In milliseconds (divide by 1000 to get seconds).
      var framerate = 50;    // In milliseconds (divide by 1000 to get seconds).
      
      var toAdd = ( ( end - start ) * framerate ) / duration;
      
      var interval = setInterval(function() {
          var currentValue = parseFloat(valueElement.innerHTML);
      
        if (currentValue >= end) {
            clearInterval(interval);
          return;
        }
      
          valueElement.innerHTML = (!isNaN(currentValue) == true ? currentValue + toAdd : toAdd);
      }, framerate);
      

      JSFiddle

      https://jsfiddle.net/joshuapinter/8uasm7ko/

      我想显示增量值,但您也可以轻松地将其包装到通用函数中。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2016-01-23
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多