Выдает ошибку при переборе .children

149
26 марта 2019, 19:30

Есть задание:

Функция должна перебрать все дочерние элементы элемента where и вернуть массив, состоящий из тех дочерних элементов следующим соседом которых является элемент с тегом P. Рекурсия - по желанию

@param {Element} where - где искать
@return {Array<Element>}

Пример для html

<div></div><p></p><a></a><span></span><p></p>

функция должна вернуть: [div, span], т.к. следующим соседом этих элементов является элемент с тегом P

Вот мой код:

    function findAllPSiblings(where) {
    var children = where.children
    var arr = [];
    for (var i = 0; i < children.length; i++) {
        if (children[i].nextElementSibling.nodeName = 'P') {
            arr.push(children[i])
        }
    }
    return arr;
}

Однако, при вызове функции findAllPSiblings(body) консоль (Firefox) выдает ошибку:

TypeError: children[i].nextElementSibling is null; can't access its "nodeName" property

В Google то же самое. Что делать? Почему не работает?

Answer 1

Вам же текст ошибки явно говорит, почему не работает.

children[i].nextElementSibling is null; can't access its "nodeName" property

children[i].nextElementSibling имеет значение null и вы не можете обратиться к свойству nodeName.

Возникает же эта ошибка не последней итерации по массиву дочерних элементов. Когда i равно children.length - 1. На данной итерации элемент является последним и он заведомо не имеет nextElementSibling, отсюда и появляется это null значение и последующая ошибка обращения к свойству.

Используйте цикл до < children.length - 1

READ ALSO
Почему срабатывает счётчик?

Почему срабатывает счётчик?

Помогите пожалуйста понять почему в шаблоне срабатывает счётчик приходящих в дочерний компонент переменных?

141
Почему не срабатывает функция [дубликат]

Почему не срабатывает функция [дубликат]

На данный вопрос уже ответили:

139
MySQL вывести строки по условиям запроса IF/ELSE CASE

MySQL вывести строки по условиям запроса IF/ELSE CASE

Допустим есть такая таблица __test_if_else

172