Estou tentando fazer um loop simples:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Mas eu recebo o seguinte erro:
VM384: 53 Tipo não detectadoErro: parent.children.forEach não é uma função
Mesmo que os parent.children
logs:
Qual poderia ser o problema?
Nota: Aqui está um JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
fonte
fonte
Respostas:
Primeira opção: invocar forEach indiretamente
O
parent.children
é um objeto parecido com uma matriz. Use a seguinte solução:O tipo
parent.children
éNodeList
, que é um objeto semelhante a uma matriz porque:length
propriedade, que indica o número de nós{0: NodeObject, 1: NodeObject, length: 2, ...}
Veja mais detalhes neste artigo .
Segunda opção: use o protocolo iterável
parent.children
é umHTMLCollection
: que implementa o protocolo iterável . Em um ambiente ES2015, você pode usar oHTMLCollection
com qualquer construção que aceite iteráveis.Use
HTMLCollection
com o operador spread:Ou com o
for..of
ciclo (que é minha opção preferida):fonte
parent.children
não é uma matriz. É HTMLCollection e não possuiforEach
método. Você pode convertê-lo para a matriz primeiro. Por exemplo, no ES6:ou usando o operador spread:
fonte
parent.children
retornará umalista delista denós, tecnicamente uma coleção html . Essa é uma matriz como objeto, mas não uma matriz, portanto, você não pode chamar funções de matriz diretamente sobre ele. Nesse contexto, você pode usarArray.from()
para converter isso em uma matriz real,fonte
Uma versão mais ingênua , pelo menos você tem certeza de que funcionará em todos os dispositivos, sem conversão e ES6:
https://jsfiddle.net/swb12kqn/5/
fonte
parent.children
é umHTMLCollection
objeto que é do tipo matriz. Primeiro, você deve convertê-lo em realArray
para usarArray.prototype
métodos.fonte
Isso porque
parent.children
é um NodeList e ele não suporta o.forEach
método (como NodeList é uma matriz como estrutura, mas não uma matriz), então tente chamá-lo convertendo-o primeiro em matriz usandofonte
Não há necessidade de
forEach
, você pode iterar usando apenas ofrom
segundo parâmetro do seguinte modo:fonte
Array.from
converte o objeto fornecido no primeiro parâmetro em uma matriz. O resultado é o mesmo da resposta do madox2 sem a necessidade de umforEach
loop extra (Array.from
MDN docs).Se você está tentando passar por um loop
NodeList
como este:Eu recomendo fazer o loop desta maneira:
Pessoalmente, eu tentei de várias maneiras, mas a maioria delas não funcionou como eu queria passar por uma
NodeList
, mas essa funciona como um encanto, experimente!O
NodeList
não é um array, mas o tratamos como um array, usandoArray.
Então, você precisa saber que ele não é suportado em navegadores mais antigos!Precisa de mais informações
NodeList
? Por favor, leia sua documentação no MDN .fonte
Como você está usando os recursos do ES6 ( funções de seta ), você também pode simplesmente usar um loop for como este:
fonte
Você pode verificar se digitou forEach corretamente, se digitou foreach como em outras linguagens de programação, não funcionará.
fonte
Você pode usar em
childNodes
vez dechildren
,childNodes
também é mais confiável, considerando problemas de compatibilidade do navegador, mais informações aqui :ou usando o operador spread:
fonte