forEach is not a function error with JavaScript array

匿名 (未验证) 提交于 2019-12-03 02:49:01

问题:

I'm trying to make a simple loop:

const parent = this.el.parentElement console.log(parent.children) parent.children.forEach(child => {   console.log(child) }) 

But I get the following error:

VM384:53 Uncaught TypeError: parent.children.forEach is not a function

Even though parent.children logs:

What could be the problem?

Note: Here's a JSFiddle.

回答1:

The parent.children is an Array like object. Use the following solution:

const parent = this.el.parentElement; console.log(parent.children); Array.prototype.forEach.call(parent.children, child => {   console.log(child) }); 

The parent.children is NodeList type, which is an Array like object because:

  • It contains the length property, which indicates the number of nodes
  • Each node is a property value with numeric name, starting from 0: {0: NodeObject, 1: NodeObject, length: 2, ...}

See more details in this article.



回答2:

parent.children is not an array. It is HTMLCollection and it does not have forEach method. You can convert it to the array first. For example in ES6:

Array.from(parent.children).forEach(function (child) {     console.log(child) }); 

or using spread operator:

[...parent.children].forEach(function (child) {     console.log(child) }); 


回答3:

parent.children will return a node list, technically a html element Collection. That is an array like object, but not an array, so you cannot call array functions over it directly. At this context you can use Array.from() to convert that into a real array,

Array.from(parent.children).forEach(child => {   console.log(child) }) 


回答4:

parent.children is a HTMLCollection which is array-like object. First, you have to convert it to a real Array to use Array.prototype methods.

const parent = this.el.parentElement console.log(parent.children) [].slice.call(parent.children).forEach(child => {   console.log(child) }) 


回答5:

That's because parent.children is a NodeList, and it doesn't support the .forEach method (as NodeList is an array like structure but not an array), so try to call it by first converting it to array using

var children = [].slice.call(parent.children); children.forEach(yourFunc); 


回答6:

A more naive version, at least your sure that it's work on all devise, without conversion and ES6 :

const children = parent.children; for (var i = 0; i < children.length; i++){     console.log(children[i]); } 

https://jsfiddle.net/swb12kqn/5/



回答7:

Since you are using features of ES6 (arrow functions), you may also simply use a for loop like this:

for(let child of [{0: [{'a':1,'b':2},{'c':3}]},{1:[]}]) {   console.log(child) }


回答8:

If you are trying to loop over a NodeList like this:

const allParagraphs = document.querySelectorAll("p"); 

I highly recommend loop it this way:

Array.prototype.forEach.call(allParagraphs , function(el) {     // Write your code here }) 

Personally, I've tried several ways but most of them didn't work as I wanted to loop over a NodeList, but this one works like a charm, give it a try!

The NodeList isn't an Array, but we treat it as an Array, using Array. So, you need to know that it is not supported in older browsers!

Need more information about NodeList? Please read its documentation on MDN.



回答9:

There is no need for the forEach, you can iterate using only the from's second parameter, like so:

let nodeList = [{0: [{'a':1,'b':2},{'c':3}]},{1:[]}] Array.from(nodeList, child => {   console.log(child) });


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!