Estoy trabajando en un proyecto Angular/firebase
en esta función:
¿Por qué obtengo una matriz con una matriz duplicada? El resultado esperado debe ser una matriz que contenga 2 objetos, cada objeto tiene sus propios valores
Especialmente con el valor dropNumber, obtengo el mismo valor (2) en ambos objetos
createAutoObject() { this.drops.length = 0; let objectToInsert = { campaignName: '', dropStatus: '', isSeededReceived: false, isLastDrop: false, isDropCompleted: false, dropNumber: 0, dropVolume: '', }; for (let i = 1; i <= 2; i++) { objectToInsert.campaignName = campaignObject.campaignName; objectToInsert.dropNumber = i; objectToInsert.dropVolume = campaignObject.firstDropVolume; this.drops.push(objectToInsert); } return this.drops; }La razón por la que ambos elementos de su matriz tienen el mismo dropNumber es que ambos apuntan al mismo objeto (objectToInsert).
Después de agregar el primer elemento a la matriz, su ciclo establece dropNumber en un valor mayor, listo para agregar el segundo elemento a la matriz. Pero objectToInsert sigue siendo la misma referencia de objeto, a la que apunta el primer elemento de la matriz.
Para crear un nuevo objeto para cada elemento que está insertando, debe agregar esta línea antes de configurar cualquier propiedad de objeto para ese elemento:
objectToInsert = new Object();Luego, cada elemento en su matriz será una referencia de objeto diferente y las propiedades tendrán los valores que espera.
Aquí hay información sobre cómo trabajar con objetos en JavaScript que puede proporcionar más ayuda en esta área.
EDITAR: con el problema básico de JavaScript explicado, ahora pensemos en cómo podría hacerlo mejor en TypeScript con una clase.
Actualmente crea una instancia de objectToInsert como un tipo anónimo, así:
let objectToInsert = { campaignName: '', . . .Los tipos anónimos son muy potentes y flexibles, pero aunque se pueden tipificar fuertemente, su anonimato significa que (por definición) no tienen un nombre de tipo que pueda usar para crear instancias de objetos individuales de ese tipo.
Los tipos con nombre, o las clases tradicionales, no tienen esta deficiencia y puede usar esto aquí para su beneficio.
Darle un nombre al tipo, como Campaign :
class Campaign { campaignName: string = ''; isSeededReceived: boolean = false; dropNumber:number = 0; dropVolume:number = 0; firstDropVolume:number = 0; }le permite referirse al tipo por su nombre al instanciar objetos:
for (let i = 1; i <= 2; i++) { let objectToInsert = new Campaign(); objectToInsert.campaignName = campaignObject.campaignName; objectToInsert.dropNumber = i; objectToInsert.dropVolume = campaignObject.firstDropVolume; this.drops.push(objectToInsert); } La matriz de miembros this.drops , a la que hace referencia pero cuya declaración no se ve aquí, obviamente necesitaría un tratamiento similar. Es decir, tanto la matriz como cualquier otro código que la use también necesitarían actualizarse para pensar en términos de Campaign en lugar de Object . Los detalles de eso dependerán de su diseño, pero deben explicarse por sí mismos.
Aparte del aspecto de autodocumentación de tener un nombre de tipo, el beneficio que esto trae es que su código tiene una mayor seguridad de tipos, ya que ya no está obligado a usar any para agregar objetos a la matriz.
Hay un TypeScript Playground que puede resultarle útil para probar cosas rápidamente en línea.