How to delete multiple items of an array by value?

2020-07-01 13:58发布

I am trying to make a removeAll() function, which will remove all elements of an array with that particular value (not index).

The tricky part comes when we make any change to the loop, the indexes tend to move around (making it very hard to make it work like we want) and, restarting the loop every time we make changes is very inefficient on big arrays.

So far, I wrote my own arr.indexOf function (for older IE support), it looks like this:

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

It is easy to remove elements like this:

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

However, as I pointed out earlier, when doing this while looping, we get in trouble.

Any ideas on how to properly remove array items while looping through it?

4条回答
Ridiculous、
2楼-- · 2020-07-01 14:27

Every new browser has an Array filter method:

var myarray=[0,1,2,3,4];
var removal=2;
var newarray=myarray.filter(function(itm){return itm!==removal});
查看更多
▲ chillily
3楼-- · 2020-07-01 14:31

I wrote this little function where arr is the original array and d1, d2 the values you want removed. I wonder how it could be generalized to an arbitrary number of values to be removed. Well, I'm just a beginner.

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;
查看更多
ら.Afraid
4楼-- · 2020-07-01 14:41

Loop in reverse order or build a new array with the items that are not to be removed.

查看更多
时光不老,我们不散
5楼-- · 2020-07-01 14:47

Try this one. You just have to check the indices of the numbers you would like to remove. I have added additional elements in your array.

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]
查看更多
登录 后发表回答