【问题标题】:Why does my solution work and this other solution doesnt?为什么我的解决方案有效而其他解决方案无效?
【发布时间】:2015-09-12 15:12:19
【问题描述】:

如果您注意到从索引 0 开始并向上计数的 for 循环的结果并没有从数组中取出数字 23。

使用 JavaScript 循环遍历 evenArray 删除所有非偶数的值

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = evenArray.length - 1; i >= 0; i--) {
  if(evenArray[i] % 2 != 0){
    evenArray.splice(i, 1);
   }
 };
 console.log(evenArray);  

//输出到this将是2,6,22,98,22,12;

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = 0; i < evenArray.length; i++) {
    if(evenArray[i] % 2 != 0){
        evenArray.splice(i, 1);
    }
};

console.log(evenArray);

//输出为[2, 6, 22, 98, 23, 22, 12];

【问题讨论】:

  • 调试一下就知道了。遍历每个 for 循环,每次拼接后暂停。你会看到发生了什么。
  • 太棒了!好主意啊。我需要习惯使用调试器来剖析我的代码。

标签: javascript arrays loops for-loop


【解决方案1】:

只需在代码中添加一个打印:

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = 0; i < evenArray.length; i++) {
    console.log("index:"+i+" value:"+evenArray[i])
    if(evenArray[i] % 2 != 0){
        evenArray.splice(i, 1);
    }
}

输出如下:

index:0 value:1
index:1 value:3
index:2 value:22
index:3 value:98
index:4 value:45
index:5 value:22
index:6 value:12

与原始数组相比,它正在切割。 原因是splice是动态切割你的数组,所以在拼接后索引改变了,值23原点索引是7,但是拼接后它移动到索引之前6

[1,2,3,6,22,98,45,23,22,12];

【讨论】:

    【解决方案2】:

    Dylan 的回答是正确的,它解释了为什么一个有效而另一个失败。

    无论如何,一个可行的简单解决方案是:

    var evenArray = [1,2,3,6,22,98,45,23,22,12];
    
    evenArray = evenArray.filter(function(val) { return val % 2 == 0; });
    
    console.log(evenArray);

    【讨论】:

      【解决方案3】:

      当您splice 数组中的一个数字时,数组中该点之后的所有值都会向左移动。

      在第二种方法中,索引 6 处的值为 45。你检测到它是奇怪的,所以你拼接。现在 23、22 和 12 被移动,因此 23 现在位于索引 6。但是由于您正在向前迭代,您的 i++ 将您向上移动到索引 7,有效地跳过了 23,这就是为什么 23 在结果。

      当你向后迭代时,你可以避免这个问题,因为所有被移动的数字都已经被执行了。

      【讨论】:

      • 话虽如此,在第二个 sn-p 的拼接之后添加i--; 应该可以解决那个问题,对吧?编辑:甚至将拼接线更改为evenArray.splice(i--, 1);
      • @JosephMarikle 是的,这将纠正“漂移”问题
      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 2015-10-25
      • 2017-01-30
      • 1970-01-01
      • 2019-06-30
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多