如何按值删除数组中的多个项目?

时间:2012-02-15 03:23:23

标签: javascript arrays

我正在尝试创建一个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

但是,正如我之前所指出的那样,在循环时执行此操作时,我们遇到了麻烦。

关于如何在循环播放时正确删除数组项目的任何想法?

4 个答案:

答案 0 :(得分:43)

以相反顺序循环或使用不要删除的项目构建新数组。

答案 1 :(得分:23)

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

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

答案 2 :(得分:4)

试试这个。您只需要检查要删除的数字的索引。我在你的数组中添加了其他元素。

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]

答案 3 :(得分: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;