Как будем определять, должен ли элемент массива остаться:
const mustStay = arr => arr.every(n => n.value !== '-');
Собираем новый массив:
const newArr = arr.filter(mustStay);
// или
const newArr = [];
for (const n of arr) {
if (mustStay(n)) {
newArr.push(n);
}
}
// или
const newArr = [];
for (let i = 0; i < arr.length; i++) {
if (mustStay(arr[i])) {
newArr[newArr.length] = arr[i];
}
}
// или
const newArr = (function get(i, n = arr[i]) {
return n
? [ mustStay(n) ? [ n ] : [], get(i + 1) ].flat()
: [];
})(0)
Изменяем существующий:
for (let i = 0; i < arr.length; i++) {
if (!mustStay(arr[i])) {
for (let j = i--; ++j < arr.length; arr[j - 1] = arr[j]) ;
arr.pop();
}
}
// или
arr.reduceRight((_, n, i, a) => mustStay(n) || a.splice(i, 1), null);
// или
arr.splice(0, arr.length, ...arr.filter(mustStay));
// или
arr.length -= arr.reduce((acc, n, i, a) => (
a[i - acc] = n,
acc + !mustStay(n)
), 0);