идет смещение индексов, но как это обойти, уже не знаю
Можно перебирать массив индексов с конца:
for (let i = arr.length; i--; ) {
invItems.splice(arr[i], 1);
}
Или развернуть его:
for (const n of [...arr].reverse()) {
invItems.splice(n, 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;