Cuando agrego elementos a una matriz, ¿solo se agrega el último elemento a la matriz? No puedo encontrar lo que está mal en el cierre.
const data = require('../content/data') function randomize() { const ds_size = Math.floor(Math.random() * 500) + 50 //Generate no of objects in stream let name_index = 0 let origin_city_index = 0 let destination_city_index = 0 let org_message = { name: '', origin: '', destination: '' } let ds = []; return function getDs() { for(let i = 0; i< ds_size; i++) { name_index = Math.floor(Math.random() * data.names.length) origin_city_index = Math.floor(Math.random() * data.cities.length) destination_city_index = Math.floor(Math.random() * data.cities.length) org_message.name = data.names[name_index] org_message.origin = data.cities[origin_city_index] org_message.destination = data.destination[destination_city_index] ds.push(org_message) } return ds } } module.exports = {randomize}Está reutilizando el mismo objeto org_message para cada entrada en la matriz, por lo que todos los elementos de la matriz apuntarán exactamente al mismo objeto (independientemente de cómo haya modificado el objeto por última vez) y, por lo tanto, todos contendrán exactamente lo mismo.
En su lugar, cree un nuevo objeto para cada iteración del ciclo para que cada elemento de la matriz contenga su propio objeto. En Javascript, los objetos se pasan a funciones, se devuelven desde funciones o se insertan en matrices como punteros, no como copias. Entonces, ds.push(org_message) simplemente empuja un puntero a org_message en la matriz, por lo que debe crear un nuevo objeto para cada elemento de la matriz si desea que todos sean diferentes.
const data = require('../content/data') function randomize() { const ds_size = Math.floor(Math.random() * 500) + 50 //Generate no of objects in stream let name_index = 0 let origin_city_index = 0 let destination_city_index = 0 return function getDs() { let ds = []; for(let i = 0; i< ds_size; i++) { let org_message = { name: '', origin: '', destination: '' }; name_index = Math.floor(Math.random() * data.names.length) origin_city_index = Math.floor(Math.random() * data.cities.length) destination_city_index = Math.floor(Math.random() * data.cities.length) org_message.name = data.names[name_index] org_message.origin = data.cities[origin_city_index] org_message.destination = data.destination[destination_city_index] ds.push(org_message) } return ds } } module.exports = {randomize} También moví la declaración de ds dentro de la función devuelta porque sin eso, estará reutilizando la misma matriz ds cada vez que se llame a la función devuelta, que simplemente agregará más elementos al final de la misma matriz y modificará el matriz que se devolvió en llamadas anteriores.
Recuerde que los objetos en Javascript son utilizados por el puntero, por lo que pasar uno o devolver uno pasa un puntero al objeto; el objeto no se copia.