AlexaShemetova
@AlexaShemetova
While I'm breathing - I love and believe

Как удалить элементы массива внутри цикла JS?

Есть массив с индексами которые являются индексами элементов в другом массиве, как удалить из второго массива эти элементы? В моем примере удаляется только первый элемент Предмет_1. второй остается, да понимаю что идет смещение индексов, но как это обойти, уже не знаю что делать
var invItems = [
    {
        nameItem: 'Предмет_1'
    },
  {
        nameItem: 'Тест'
  },
    {
        nameItem: 'Предмет_2'
    }
];

var arr = [0,2];

for (var i = 0; i < arr.length; i++) {
  var index = arr[i];
  invItems.splice(index, 1);
}
console.log(invItems);
  • Вопрос задан
  • 4406 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
идет смещение индексов, но как это обойти, уже не знаю

Можно перебирать массив индексов с конца:

for (let i = arr.length; i--;) {
  invItems.splice(arr[i], 1);
}

Или развернуть его:

for (const n of [...arr].reverse()) {
  invItems.splice(n, 1);
}

Или исправлять индексы - вычитать из них количество уже удалённых элементов, это будет индекс индекса:

for (const [ i, n ] of arr.entries()) {
  invItems.splice(n - i, 1);
}

Или, есть вариант ограничить применение метода splice единственным вызовом - сначала собираем подходящие элементы, а затем полностью заменяем ими содержимое массива с данными (применимо и в том случае, если массив индексов не отсортирован):

invItems.splice(0, invItems.length, ...invItems.filter((n, i) => !arr.includes(i)));

Или, долой splice, будем использовать два счётчика - один для массива данных, другой для массива индексов. Второй одновременно будет счётчиком удаляемых элементов. Перебираем массив данных, копируем элементы влево на столько позиций, сколько в данный момент элементов должно быть удалено, увеличиваем счётчик удалённых элементов если текущий индекс массива с данными равен текущему элементу массива индексов, после обхода массива с данными удаляем посчитанное количество элементов с конца:

let numDeleted = 0;

for (let i = 0; i < invItems.length; i++) {
  invItems[i - numDeleted] = invItems[i];
  numDeleted += i === arr[numDeleted];
}

invItems.length -= numDeleted;
Ответ написан
like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей
var invItems = [
    {
        nameItem: 'Предмет_1'
    },
  {
        nameItem: 'Тест'
  },
    {
        nameItem: 'Предмет_2'
    }
];

var arr = [0,2],
    arrLength = invItems.length;

for (var i = 0; i < arrLength; i++) {
   for (var j = 0; i < arr.length; j++) {
       if (i === j) {
           invItems.splice(i, 1);
           break;
       }
   }
  
}
console.log(invItems);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы