【问题标题】:Filtering an array but Item is being skipped过滤数组,但项目被跳过
【发布时间】:2018-04-01 02:21:10
【问题描述】:

我正在尝试使用以下方法过滤数组,但是,我有一个被跳过的值!

function filterArray(array,remove){
    
    console.log('Array Length:',array.length)
    console.log("Array:",array);
    console.log('Remove:',remove);
    console.log('------');
    array.forEach(function(e){       
       if(remove.includes(e.serial)){
           console.log('remove this item:',e);
           array.splice(array.indexOf(e),1);
       }       
    });
    
    console.log('New Array Length:',array.length);
    return array;
}

我不知道为什么会这样。有人能解释一下这种情况吗?

这是我的控制台输出

【问题讨论】:

  • 为什么不直接使用array.filter
  • 如果您使用拼接删除当前数组元素,那么next 元素将成为当前元素,并且在您的 forEach 回调函数被调用之后发生的最后一件事是当前索引递增,因此你跳过下一个元素是什么
  • @EvanTrimboli - array.splice 改变数组,array.filter 返回一个新数组 - 这可能不是代码的意图
  • 可能,但该函数返回一个数组,因此您可以想象其意图不一定是在原地对其进行变异。
  • 提示:有时for loop 是比 .forEach/.map/.filter/.etc 更好的工具

标签: javascript arrays foreach array-splice


【解决方案1】:

假设你不想改变原始数组,你可以使用过滤器:

function filterArray(array, remove){
    return array.filter(e => !remove.includes(e.serial));
}

【讨论】:

猜你喜欢
  • 2021-04-21
  • 2021-12-27
  • 2022-11-02
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多