Javascript filterRangeInPlace(arr,a,b),它获取数组arr并从中删除除a和b之间的值以外的所有值

Javascript filterRangeInPlace(arr,a,b),它获取数组arr并从中删除除a和b之间的值以外的所有值,javascript,html,arrays,foreach,Javascript,Html,Arrays,Foreach,下面的函数工作得很好 函数filterRangeInPlace(arr,a,b){ for(设i=0;i{ 设偏移量=0; arr.forEach((项目,i,就地)=>{ 如果(项目b){ 原位拼接(i,1); offset++; } 让温度偏移=偏移量; 而(温度偏移>0) { 让偏移量项目=就地[i-温度偏移量]; 如果(偏移量项目b){ 就地拼接(i-temp_偏移量,1); offset++; } 温度偏移量--; } }) } arr=[2,3,4,5,6,7,1,0,2,12,1

下面的函数工作得很好

函数filterRangeInPlace(arr,a,b){
for(设i=0;ib){
阵列拼接(i,1);
我--;
}
}
}
arr=[2,3,4,5,6,7,1,0,2,12,11];
过滤界面(arr,1,5);

警报(arr)您无法使用forEach对数组进行就地修改,因为您无法控制forEach内部发生循环的索引

forEach的一个简单实现如下

Array.prototype.forEach = function(cb) {
   const arr = this;
   for(var i = 0; i < arr.length; i++) {
     cb.call(arr, arr[i], i, arr);
   }
}
对的调用将创建在开始处理之前要处理的元素范围

因此,当您访问
i
时,您访问的是调用
forEach
时的值,而不是在运行回调函数时。另外,
i--
在算法的
forEach
版本中不做任何操作,因为回调的其他实例无法访问它

此外,如果删除一个元素,那么下一个元素将被跳过,因为这些元素被移动到与迭代器对齐的位置

那么什么是被处理的2,3,4,5,6,[跳过],1,0,[跳过],12,[跳过]。这就是为什么您仍然在输出中看到7和11

要获得所需效果,您可以使用,它不会改变数组,但会覆盖它。这是我会选择的方法

但是,如果您确实想使用
forEach
对数组进行变异,则需要跟踪偏离的程度,并在执行过程中纠正错误:

let filterge=(arr,a,b)=>{
设偏移量=0;
arr.forEach((项目,i,就地)=>{
如果(项目b){
原位拼接(i,1);
offset++;
}
让温度偏移=偏移量;
而(温度偏移>0)
{
让偏移量项目=就地[i-温度偏移量];
如果(偏移量项目b){
就地拼接(i-temp_偏移量,1);
offset++;
}
温度偏移量--;
}
})
}
arr=[2,3,4,5,6,7,1,0,2,12,11,4,99,2];
过滤(arr,1,5);
console.log('result',arr)