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)代码>