如何通过值删除数组中的多个项?

19

我正在尝试创建一个removeAll()函数,它将删除数组中所有具有特定值的元素(而不是索引)。

棘手的部分在于,当我们对循环进行任何更改时,索引往往会发生变化(使其非常难以按照我们想要的方式工作),而且每次进行更改时重新启动循环在大型数组上非常低效。

到目前为止,我编写了自己的arr.indexOf函数(用于支持旧版IE),它看起来像这样:

function arrFind(val, arr) {
    for (var i = 0, len = arr.length, rtn = -1; i < len; i++) {
        if (arr[i] === val) {
            return i;
        }
    }
    return -1;
}

像这样删除元素很容易:

var myarray = [0, 1, 2, 3, 4];
var tofind = 2;

var stored_index = arrFind(tofind, myarray);
if (stored_index != -1) {
    myarray.splice(stored_index, 1);
}

alert(myarray.join(",")); //0,1,3,4

然而,正如我之前指出的,当我们在循环时这样做会遇到麻烦。

有什么正确的方法可以在循环过程中正确地删除数组项吗?


发现了这个相关的问题(https://dev59.com/wG865IYBdhLWcg3wKLT6),但它并不是重复的,因为我的问题是关于在循环内部删除多个项目时遇到的问题。 - ajax333221
4个回答

44

倒序循环或构建一个新数组,将不需要删除的项放入其中。


构建一个新的数组,只包含不等于我想要删除的项是个好主意!我会这样做。 - ajax333221
你是一个了不起的英雄!! - svarog
这里有一个JSPerf,将其与类似问题的答案进行比较:http://jsperf.com/splice-vs-pack/11对于小数组来说,这只是高效的。对于非常大的数组,标记删除然后打包数组会更加高效。 - Ali Ok
顺便提一下,效率取决于要删除的元素数量。如果要删除的元素不太多,则倒序拼接比构建新数组或将其设置为未定义并压缩数组更好。 - Ali Ok

24

每个新浏览器都有一个数组过滤方法:

var myarray=[0,1,2,3,4];
var removal=2;
var newarray=myarray.filter(function(itm){return itm!==removal});

1
如果“removal”等于[0,2,4],解决方案将是什么? - Asking
在过滤器回调中,您还需要迭代removal,检查这些值是否与item匹配,并返回此比较的结果。 - vir us

5
尝试这个方法。您只需要检查要删除的数字的索引。我已经在您的数组中添加了额外的元素。
var myarray = [0, 1, 2, 3, 2, 2, 2, 5, 6];
var indicesToRemove = new Array();

for(i=0;i<myarray.length;i++){
    if(myarray[i]===2){ //let's say u wud like to remove all 2 
        indicesToRemove.push(i); //getting the indices and pushing it in a new array
    }
}

for (var j = indicesToRemove.length -1; j >= 0; j--){
    myarray.splice(indicesToRemove[j],1);
}

alert(JSON.stringify(myarray)); //myarray will be [0,1,3,5,6]

1
这个答案比被采纳的更好,因为它有代码并且实际上保留了删除的顺序。 - Nice Books

1
我编写了这个小函数,其中arr是原始数组,d1、d2是要删除的值。我想知道如何将其推广到任意数量的要删除的值。好吧,我只是一个初学者。
function destroyer(arr, d1, d2) {
    var lean =[];
    for (var i = 0; i<arr.length; i++) {
        if (arr[i] != d1 && arr[i] != d2) {
            lean.push(arr[i]);
        }
    }
  return lean;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接