Как удалить несколько элементов массива по значению?

Я пытаюсь сделать функцию 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

Однако, как я уже указывал ранее, при выполнении этого цикла мы сталкиваемся с проблемами.

Любые идеи о том, как правильно удалить элементы массива при прохождении через него?

Ответы

Ответ 1

Loop в обратном порядке или построить новый массив с элементами, которые не нужно удалять.

Ответ 2

Каждый новый браузер имеет метод фильтра Array:

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

Ответ 3

Попробуйте это. Вам просто нужно проверить индексы номеров, которые вы хотите удалить. Я добавил дополнительные элементы в ваш массив.

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 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]

Ответ 4

Я написал эту небольшую функцию, где 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;