Можно перезаписывать разметку:
filterInput.addEventListener('input', function() {
const value = this.value.toLowerCase();
filterResult.innerHTML = resultArr
.filter(n => n.toLowerCase().includes(value))
.map(n => `<li>${n}</li>`)
.join('');
});
Или, удалять существующие элементы и создавать новые:
filterInput.addEventListener('input', e => {
const value = e.target.value.toLowerCase();
filterResult.replaceChildren(...resultArr.reduce((acc, n) => {
if (n.toLowerCase().indexOf(value) !== -1) {
(acc[acc.length] = document.createElement('li')).textContent = n;
}
return acc;
}, []));
});
Или, удалять лишние элементы и создавать недостающие, затем обновлять содержимое элементов:
filterInput.addEventListener('input', () => {
const value = filterInput.value.toLowerCase();
const r = resultArr.filter(n => ~-n.toLowerCase().split(value).length);
const c = filterResult.children;
for (; c.length > r.length; filterResult.lastElementChild.remove()) ;
for (; c.length < r.length; filterResult.append(document.createElement('li'))) ;
r.forEach((n, i) => c[i].innerText = n);
});