У последнего элемента следующего нет, так что в качестве
nextElementSibling вы получаете
null, а у
null нельзя читать свойства. Как победить возникающую ошибку? - проще всего будет вообще не трогать последний элемент, пусть цикл делает на одну итерацию меньше, для этого замените
i < children.length на
i < children.length - 1. Другой вариант - прежде чем пытаться читать свойства у следующего элемента, проверять, существует ли он, или не является ли текущий последним, или подсовывать вместо отсутствующего элемента пустой объект - актуально в том случае, если перебор элементов организован не через цикл со счётчиком, а с помощью
for...of или методов.
Ещё стоит разобраться, чем присваивание отличается от проверки на равенство (
nodeName = 'P', ну да, ну да).
Как может выглядеть исправленная (и переписанная) функция:
function findAllPSiblings(el) {
const result = [];
for (const n of el.children) {
if ((n.nextElementSibling || {}).tagName === 'P') {
result.push(n);
}
}
return result;
}
А вообще, зачем ограничиваться одними лишь
p? Давайте решим задачу в чуть более общем виде - пусть функция кроме родительского элемента принимает ещё и селектор, которому должны соответствовать соседи справа:
const getChildrenWithNext = (el, selector) =>
Array.prototype.filter.call(
el.children,
({ nextElementSibling: n }) => n && n.matches(selector)
);