Estoy tratando de hacer un bucle simple:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Pero me sale el siguiente error:
VM384: 53 Error de tipo no capturado: parent.children.forEach no es una función
Aunque los parent.childrenregistros:
¿Cual podría ser el problema?
Nota: Aquí hay un JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
fuente
fuente


Respuestas:
Primera opción: invocar forEach indirectamente
El
parent.childrenes un objeto tipo Array. Use la siguiente solución:El tipo
parent.childrenesNodeList, que es un objeto tipo Array porque:lengthpropiedad, que indica el número de nodos.{0: NodeObject, 1: NodeObject, length: 2, ...}Ver más detalles en este artículo .
Segunda opción: usar el protocolo iterable
parent.childrenes unHTMLCollection: que implementa el protocolo iterable . En un entorno ES2015, puede usarloHTMLCollectioncon cualquier construcción que acepte iterables.Usar
HTMLCollectioncon el operador de propagación:O con el
for..ofciclo (que es mi opción preferida):fuente
parent.childrenNo es una matriz. Es una colección HTMLC y no tieneforEachmétodo. Puedes convertirlo a la matriz primero. Por ejemplo en ES6:o usando el operador de propagación:
fuente
parent.childrendevolverá unalista delista denodos, técnicamente una colección html . Esa es una matriz como objeto, pero no una matriz, por lo que no puede llamar directamente a las funciones de matriz sobre ella. En este contexto, puede usarArray.from()para convertir eso en una matriz real,fuente
Una versión más ingenua , al menos está seguro de que funcionará en todos los dispositivos, sin conversión y ES6:
https://jsfiddle.net/swb12kqn/5/
fuente
parent.childrenes unHTMLCollectionobjeto tipo matriz. Primero, debe convertirlo en un método realArraypara usarArray.prototype.fuente
Esto se debe a que
parent.childrenes una NodeList y no es compatible con el.forEachmétodo (ya que NodeList es una estructura similar a una matriz pero no una matriz), por lo tanto, intente llamarla primero convirtiéndola en matriz usandofuente
No hay necesidad de
forEach, puedes iterar usando solo elfromsegundo parámetro de la siguiente manera:fuente
Array.fromconvierte el objeto dado en el primer parámetro en una matriz. El resultado es el mismo que en la respuesta de madox2 sin necesidad de unforEachbucle adicional ( documentosArray.fromMDN ).Si está tratando de recorrer un sitio
NodeListcomo este:Recomiendo encarecidamente bucle de esta manera:
Personalmente, he intentado varias formas, pero la mayoría de ellas no funcionaron, ya que quería hacer un bucle
NodeList, pero esta funciona como un encanto, ¡pruébalo!No
NodeListes una matriz, pero la tratamos como una matriz, por loArray.tanto, debe saber que no es compatible con navegadores antiguos.¿Necesita más información sobre
NodeList? Por favor lea su documentación en MDN .fuente
Como está utilizando las funciones de ES6 ( funciones de flecha ), también puede simplemente usar un bucle for como este:
fuente
Puedes verificar si escribiste correctamente para Cada , si escribiste foreach como en otros lenguajes de programación, no funcionará.
fuente
Puede usar en
childNodeslugar dechildren,childNodestambién es más confiable teniendo en cuenta los problemas de compatibilidad del navegador, más información aquí :o usando el operador de propagación:
fuente