идет смещение индексов, но как это обойти, уже не знаю
Можно перебирать массив индексов с конца:
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, будем использовать два счётчика - один для массива данных, другой для массива индексов. Второй одновременно будет счётчиком удаляемых элементов. Перебираем массив данных, копируем элементы влево на столько позиций, сколько в данный момент элементов должно быть удалено, увеличиваем счётчик удалённых элементов если текущий индекс массива с данными равен текущему элементу массива индексов, после обхода массива с данными удаляем посчитанное количество элементов с конца:
invItems.length -=
invItems.reduce((acc, n, i, a) => (
a[i - acc] = n,
acc + (i === arr[acc])
), 0);