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