Por fin después de tanto trabajar hemos encontrado la respuesta de esta incógnita que tantos usuarios de esta web tienen. Si tienes algún dato que compartir no dejes de compartir tu comentario.
La excepción de JavaScript “no es iterable” ocurre cuando el valor que se da como el lado derecho de para … de o como argumento de una función como Promise.all
o TypedArray.from
, no es un objeto iterable.
Mensaje
TypeError:'x' is not iterable(Firefox, Chrome) TypeError:'x' is not a function or its return value is not iterable(Chrome)
Tipo de error
TypeError
¿Qué salió mal?
El valor que se da como el lado derecho de para … de o como argumento de una función como Promise.all
o TypedArray.from
, no es un objeto iterable. Un iterable puede ser un tipo iterable incorporado, como Array
, String
o Map
, un resultado del generador o un objeto que implementa el protocolo iterable.
Ejemplos de
Iterando sobre las propiedades del objeto
En JavaScript, Object
s no son iterables a menos que implementen el protocolo iterable. Por lo tanto, no puede usar para … de para iterar sobre las propiedades de un objeto.
var obj ='France':'Paris','England':'London';for(let p of obj)// TypeError: obj is not iterable// …
En su lugar, tienes que usar Object.keys
o Object.entries
, para iterar sobre las propiedades o entradas de un objeto.
var obj ='France':'Paris','England':'London';// Iterate over the property names:for(let country of Object.keys(obj))var capital = obj[country]; console.log(country, capital);for(const[country, capital]of Object.entries(obj)) console.log(country, capital);
Otra opción para este caso de uso podría ser utilizar un Map
:
var map =newMap; map.set('France','Paris'); map.set('England','London');// Iterate over the property names:for(let country of map.keys())let capital = map[country]; console.log(country, capital);for(let capital of map.values()) console.log(capital);for(const[country, capital]of map.entries()) console.log(country, capital);
Iterando sobre un generador
Generadores son funciones a las que llama para producir un objeto iterable.
function*generate(a, b)yield a;yield b;for(let x of generate)// TypeError: generate is not iterable console.log(x);
Cuando no son llamados, los Function
El objeto correspondiente al generador es invocable, pero no iterable. Llamar a un generador produce un objeto iterable que iterará sobre los valores producidos durante la ejecución del generador.
function*generate(a, b)yield a;yield b;for(let x ofgenerate(1,2)) console.log(x);
Iterando sobre un iterable personalizado
Se pueden crear iterables personalizados implementando el Symbol.iterator
método. Debe estar seguro de que su método iterador devuelve un objeto que es un iterador, es decir, debe tener un método siguiente.
const myEmptyIterable =[Symbol.iterator]()return[]// [] is iterable, but it is not an iterator -- it has no next method. Array.from(myEmptyIterable);// TypeError: myEmptyIterable is not iterable
Aquí hay una implementación correcta:
const myEmptyIterable =[Symbol.iterator]()return[][Symbol.iterator]() Array.from(myEmptyIterable);// []
Ver también
- protocolo iterable
Object.keys
Object.entries
Map
- generadores
- para … de
Acuérdate de que tienes permiso de valorar este tutorial si te fue útil.