js 如何一次性删除数组中的多个元素?

用for循环或者forEach遍历数组的话,在方法体内部splice都得不到正确的结果。有什么好的办法解决这个问题吗?

var arr=[2,3,5,7];
arr.forEach(function(item,idx){
  if(item===5){
      arr.splice(idx,1);
  }
})
阅读 38k
8 个回答

今天回来看这个回答,虽然没错,但是有点偏题。就拿问题中的用例来说,有两个方法

方法一,用 filter

var arr = [2, 3, 5, 7];
arr = arr.filter(item => item !== 5);

方法二,用逆向循环

var arr = [2, 3, 5, 7];
for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i] === 5) {
        arr.splice(i, 1);
    }
}

forEach 不是什么时候都适用的,如果不改变原数组,用 map 比较合适,如果要直接改变原数组,用 for 比较合适。


之前的回答

删除单个是不会有问题的,问题只可能出在删除多个的情况下,因为删除了前面的后面的按原序号就对应不上了

如果要删除多个,可以用这个办法——按序号从后往前删

比如要删除 [1, 2, 3, 5, 9, 8, 10, 7] 中的偶数,可以

var arr = [1, 2, 3, 5, 9, 8, 10, 7];
var indexes = arr
    // 如果是偶数返回序号,否则返回 -1
    .map((n, i) => n % 2 === 0 ? i : -1)
    // 找出不是 -1 的,即所有偶数的序号
    .filter(i => i >= 0);

console.log(indexes);
// [ 1, 5, 6 ]

// 按从大到小排序(之前的结果就是从小到大的,所以这里不需要排序,直接逆)
indexes = indexes.reverse();

for (var i = 0; i < indexes.length; i++) {
    arr.splice(indexes[i], 1);
}

console.log(arr);
// [ 1, 3, 5, 9, 7 ]

你的方法没问题啊,可以删除5

如果你是想删除数组里面的所有指定的元素,比如值为5的所有元素,那么可以这样写:注意不要缓存length,它是动态的,这里也不能用forEach,因为forEach方法它一开始执行就自动缓存数组的长度,删除数组元素会出现意外;

var arr = [1,2,5,4,5,6,7,8,5];
for(var i = 0;i<arr.length;i++){
    if(arr[i]===5){
        arr.splice(i,1);
        i--;
    }
}
console.log(arr); //[1,2,4,6,7,8]

underscore

without

_.without(array, *values)
Returns a copy of the array with all instances of the values removed.

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
=> [2, 3, 4]

我可不可以这么理解,把不需要删除的放在另一个数组,返回就是删除后的数组

var newarr ...
数组循环:{
如果不需要删除,newarr.push(obj)
}
return newarr

  1. 要么从后往前删

  2. 要么创建一个新的数组,然后扫描当前数组,把有效数据push到新的里面去。

如果允许生成一个新的数组
var arr=[2,3,5,7,5];

    var bb=arr.filter(function(x){
        if(x!=5){return true}
        else{return false}
    })
    console.log(bb)

实现为 倒序删除 推荐使用 while

 (function () {
        var arr = [1,2,2,3,4,5];
        var i = arr.length;
        while(i--){
            console.log(i+"="+arr[i]);
            if(arr[i]==2){
                arr.splice(i,1);
            }
        }
        console.log(arr);
    })();

使用 while 的原因 javascript循环性能比较
建议:不要在循环中 使用 splice doApplyEdits Lines inserted using splice

如果是已知要被删除的下标 ,可以用

      for (const i of deleteIndex.reverse()) {
        paths.splice(i, 1);
      }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏