【问题标题】:Problems with the "+" and "-" operators“+”和“-”运算符的问题
【发布时间】:2014-05-29 00:00:02
【问题描述】:

问题是- 运算符不起作用(在第 8 行)。请参阅下面的代码:

array = [0,0,0,0,3,0,0,0,0],
n = 0;

for(var i = 0; i < array.length; i++){
    if(n < 9){ //the "n" variable there's only for don't crash the browser with a infinite loop
        if(array[i] == 3){
            array[i] = 0;
            array[i - 1] = 3; //I believe that here is the problem
        }
    }
n++;
}

console.log(array);

所以... 我想将“3”值移动到数组的开头。但它只有在我使用 + 运算符(在第 8 行)时才有效。因此,如果我使用 + 之一,“3”值将移至数组的末尾。

有人知道为什么- 运算符在这种情况下不起作用而+ 起作用吗?

【问题讨论】:

  • 这类问题可以用纸笔轻松调试。跟踪i的当前值、数组的内容等,一步步走一遍代码。
  • 问题是对于 i = 0 , i-1 不是数组的有效索引。
  • 在您发布问题之前测试您的代码并挑战您自己的假设。您要求其他人花费宝贵的时间来帮助您,因此请尽一切努力您提出要求之前了解正在发生的事情。

标签: javascript algorithm


【解决方案1】:

如果将第 8 行更改为:

array[i+1] = 3;

然后数字 3 将一直到数组的末尾(嗯,超出数组的末尾,我会被诅咒找出 Javascript 的作用!)。这是因为循环以递增的顺序遍历数组,接下来将检查位置i+1

另一方面,在您当前的第 8 行中,数字 3 向后移动一个位置(已经检查过),因此它不会一直到数组的开头,只是一个位置。如果你想让它以同样的方式一路走下去,你应该反转循环(让它按照位置i的降序遍历数组)。

【讨论】:

    【解决方案2】:

    你认为当 i 为 0 而你为 - 1 时会发生什么?

    【讨论】:

    • i==0和数组是第1行所示的那个时,他不做-1
    【解决方案3】:

    在循环的第一次迭代中,当 i 为零时,(i - 1) 为 -1,因此您尝试访问数组 [-1],这是无效的。

    【讨论】:

    • 不是无效的,是从最后倒数。
    • 它可能会倒数,但几乎可以肯定这不是本例的意图。
    • 另外,实际上是否倒数是非标准的。在我的解释器中,[1,2,3,4,5,6][-1] 是未定义的。
    • @AShelly — 不,它会创建一个属性“-1”并分配值。数组本质上是具有特殊长度属性的普通对象。属性是字符串,而不是数字,
    • 不,我想。你可以看到有这个条件: if(array[i] == 3) 所以我正在访问“3”索引,在这种情况下是: 4 4 - 1 = 3 嗯......有一个循环,因此循环将执行:4 - 1 = 3,在 3 - 1 = 2 之后,依此类推。如果你尝试做array[i + 1],你可以看到它会发生,因此:4 + 1 = 5, 5 + 1 = 6 等等......
    【解决方案4】:

    好吧,与其回答“有人知道为什么 - 运算符在这种情况下不起作用而 + 起作用吗?”,我将回答我认为是真正的问题,如原帖所述:我想要将“3”值移动到数组的开头。我认为这可以满足需要:

    var array = [0,0,0,0,3,0,0,0,0];
    var first_val = 3;
    
    var index = array.indexOf(first_val);
    if (index > 0) {
        array.splice(index, 1);
        array.unshift(first_val);
    }
    
    console.log(array);
    

    灵感来自this

    【讨论】:

      【解决方案5】:

      我想将“3”值移动到数组的开头

      使用here 中提供的正确答案。然后使用.indexOf() 移动它。

      Array.prototype.move = function (old_index, new_index) {
          if (new_index >= this.length) {
              var k = new_index - this.length;
              while ((k--) + 1) {
                  this.push(undefined);
              }
          }
          this.splice(new_index, 0, this.splice(old_index, 1)[0]);
          return this; // for testing purposes
      };
      
      var array = [0,0,0,0,3,0,0,0,0];
      
      var result = array.move(array.indexOf(3),0);
      
      console.log(result);
      

      JSFiddle Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 2022-09-23
        • 2015-07-25
        • 1970-01-01
        相关资源
        最近更新 更多