首页 > 解决方案 > filterRangeInPlace(arr, a, b) 获取数组 arr 并从中删除除 a 和 b 之间的值之外的所有值

问题描述

下面的功能很好用

function filterRangeInPlace(arr, a, b) {

  for (let i = 0; i < arr.length; i++) {
    let val = arr[i];

    // remove if outside of the interval
    if (val < a || val > b) {
      arr.splice(i, 1);
      i--;
    }
  }

}

arr=[2,3,4,5,6,7,1,0,2,12,11];
filterRangeInPlace(arr,1,5);
alert(arr);

但我想用 forEach 做同样的功能

let filterRange = (arr, a, b) => {
  arr.forEach((item, i) => {
    val=item;debugger;
    if (val < a || val > b) {
      arr.splice(i, 1);
      i--;
    }
  })
}
arr=[2,3,4,5,6,7,1,0,2,12,11];
filterRange(arr,1,5);
alert(arr);

我试过了,但我无法得到正确的答案。它不像正常的迭代那样工作。有没有其他方法可以使用相同的foreach

标签: javascripthtmlarraysforeach

解决方案


您不能使用 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);
   }
}

如果你看看上面的人,回调只是用 arr[i] 值调用,如果数组发生了变异,你将无法改变内部迭代器

对于像您这样的用例,您应该使用Array.prototype.filter

let filterRange = (arr, a, b) => {
  return arr.filter((item, i) => {
    val=item;
    if (val < a || val > b) {
      return false;
    }
    return true;
  })
}
var arr=[2,3,4,5,6,7,1,0,2,12,11];
arr = filterRange(arr,1,5);
alert(arr);


推荐阅读