идет смещение индексов, но как это обойти, уже не знаю
Можно перебирать массив индексов с конца:
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;