En mi JSFiddle , simplemente estoy tratando de iterar sobre una matriz de elementos. La matriz no está vacía, como demuestran las declaraciones de registro. Sin embargo, la llamada a forEach
me da el (no tan útil) error "No detectado TypeError
: undefined
no es una función".
Debo estar haciendo algo estúpido; ¿Qué estoy haciendo mal?
Mi código:
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr.forEach(function(v, i, a) {
console.log(v);
});
.myClass {
background-color: #FF0000;
}
<div class="myClass">Hello</div>
javascript
foreach
Jer
fuente
fuente
arr
no es una matriz, sino unaHTMLCollection
. No tiene los mismos métodos que una matriz. developer.mozilla.org/en-US/docs/Web/API/… . Aquí hay una publicación SO incluso al respecto: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });
está bien. ¿Cuál es la diferencia entre esto y la matriz en mi ejemplo?arr instanceof Array
resultado,false
no podrá utilizar ningún método prototipo delArray
objeto, como Array.prototype.forEach () .arr
es una HTMLCollection y una matriz como un objeto (pero no hereda ni crea una instanciaArray
). Por lo tanto, sufor
ciclo estándar funcionará ya que simplemente itera a través del índice del objeto y no es un prototipo deArray
.Respuestas:
Eso es porque
document.getElementsByClassName
devuelve una colección HTMLCollection , no una matriz.Afortunadamente, es un objeto "similar a una matriz" (lo que explica por qué se registra como si fuera un objeto y por qué puede iterar con un
for
bucle estándar ), por lo que puede hacer esto:Con ES6 (en navegadores modernos o con Babel), también puede usar
Array.from
que crea matrices a partir de objetos similares a matrices:o distribuir el objeto similar a una matriz en una matriz:
fuente
arguments
es uno. Los objetos jQuery son otro. Podrías hacer uno tú mismo:var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
debería funcionar. Todavía estoy esperando que se agreguen iteradores a la API NodeList. :-(Array.prototype.forEach
, no le permitirá hacerlo. Si tiene ese requisito, use elfor
bucle estándar más adelante o si desea usar el objeto de matriz, useArray.prototype.every
oArray.prototype.some
(tenga en cuenta que todos / algunos no son compatibles con IE8 o menos)splice
en esa definición, pero cuando quiero ser más "como una matriz" para poder usarmap
,filter
etc., entonces lo incluyo.forEach
No es necesario el uso de iteraciones simplessplice
.Prueba esto, debería funcionar:
fuente
en el caso de que desee acceder al ID de cada elemento de una clase específica puede hacer lo siguiente:
fuente