Я пытаюсь сделать простой цикл:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Но я получаю следующую ошибку:
VM384: 53 Uncaught TypeError: parent.children.forEach не является функцией
Хотя parent.children
журналы:
В чем может быть проблема?
Примечание: вот JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
источник
источник
Ответы:
Первый вариант: вызвать forEach косвенно
Объект
parent.children
типа Array. Используйте следующее решение:Тип
parent.children
isNodeList
, который является объектом типа Array, потому что:length
свойство, которое указывает количество узлов{0: NodeObject, 1: NodeObject, length: 2, ...}
Смотрите более подробную информацию в этой статье .
Второй вариант: использовать итеративный протокол
parent.children
являетсяHTMLCollection
: который реализует итеративный протокол . В среде ES2015 вы можете использоватьHTMLCollection
любую конструкцию, которая принимает итерации.Используйте
HTMLCollection
с оператором распространения:Или с
for..of
циклом (который является моим предпочтительным вариантом):источник
parent.children
это не массив. Это HTMLCollection и у него нетforEach
метода. Вы можете сначала преобразовать его в массив. Например в ES6:или используя оператор распространения:
источник
parent.children
вернетсписокспискаузлов, технически HTML-коллекцию . Это объект типа массива, но не массив, поэтому вы не можете напрямую вызывать функции массива над ним. В этом контексте вы можете использовать,Array.from()
чтобы преобразовать это в реальный массив,источник
Более наивная версия, по крайней мере, вы уверены, что она будет работать на всех устройствах без конвертации и ES6:
https://jsfiddle.net/swb12kqn/5/
источник
parent.children
являетсяHTMLCollection
объектом, похожим на массив. Во- первых, вы должны преобразовать его в реальнойArray
для использованияArray.prototype
методов.источник
Это потому, что
parent.children
это NodeList , и он не поддерживает.forEach
метод (так как NodeList представляет собой массив, похожий на структуру, но не массив), поэтому попробуйте вызвать его, сначала преобразовав его в массив, используяисточник
В этом нет необходимости
forEach
, вы можете выполнять итерацию, используя толькоfrom
второй параметр, например:источник
Array.from
преобразует объект, указанный в первом параметре, в массив. Результат такой же, как в ответе madox2, без необходимости дополнительногоforEach
цикла (Array.from
MDN документы).Если вы пытаетесь перебрать
NodeList
подобное:Я настоятельно рекомендую сделать это следующим образом:
Лично я пробовал несколько способов, но большинство из них не работало, потому что я хотел перебрать
NodeList
, но этот работает как шарм, попробуй!NodeList
Не является массив, но мы рассматриваем его как массив, используяArray.
Таким образом, вы должны знать , что она не поддерживается в старых браузерах!Нужна дополнительная информация о
NodeList
? Пожалуйста, прочитайте его документацию по MDN .источник
Поскольку вы используете функции ES6 ( функции стрелок ), вы также можете просто использовать цикл for следующим образом:
источник
Вы можете проверить, правильно ли вы ввели forEach , если вы ввели foreach, как и в других языках программирования, это не сработает.
источник
Вы можете использовать
childNodes
вместоchildren
,childNodes
также более надежно, учитывая проблемы совместимости браузера, больше информации здесь :или используя оператор распространения:
источник