Este código está asignando el valor de 'temps' a this.messages por alguna razón que no entiendo, cualquier ayuda sería apreciada. Sé que el problema radica en el siguiente fragmento de código, ya que eliminar la sección .sort cambia el orden de salida de this.messages.
this.currentMessageSubject.subscribe(()=> { console.log('Refreshing messages') if (this.conversationId) { firebase.firestore().collectionGroup('conv').where("parentMessageId", "==", this.conversationId).get().then(async (querySnapshot) => { let temps: FirebaseMessages; let tempsMsgs = new Map(); temps = this.messages; temps.messages = [] querySnapshot.forEach((newConvo) => { const thing = { id: newConvo.id, ...newConvo.data() } as FirebaseMessage; if (!tempsMsgs.has(thing.id)) { tempsMsgs.set(thing.id, thing) temps.messages.push(thing); } }) temps.messages.sort(function(a,b){ return a.timestamp.seconds - b.timestamp.seconds; }); temps.messages = temps.messages.filter((message) => { if (message.id) { return true; } return false; }) }) } })Si asigna un valor no primitivo a una variable (es decir, un objeto), se pasará por referencia.
Entonces, en tu caso esta línea:
temps = this.messages; asigna el mismo objeto que está en sus this.messages a su variable temps . Por lo tanto, editar temps también editará this.messages , ya que ambos apuntan al mismo objeto.
Tendrá que clonar su objeto y asignar el clon a su variable temps . Con respecto a la clonación, hay varias buenas respuestas sobre la clonación de objetos en SO, por lo que no cubriré eso aquí ya que no conocemos la estructura de los messages .
Al hacer temps = this.messages; , la referencia se pasa a temps .
Debe clonar este objeto de otra manera (observe la línea de cambio 7):
this.currentMessageSubject.subscribe(()=> { console.log('Refreshing messages') if (this.conversationId) { firebase.firestore().collectionGroup('conv').where("parentMessageId", "==", this.conversationId).get().then(async (querySnapshot) => { let temps: FirebaseMessages; let tempsMsgs = new Map(); temps = {...this.messages}; temps.messages = [] querySnapshot.forEach((newConvo) => { const thing = { id: newConvo.id, ...newConvo.data() } as FirebaseMessage; if (!tempsMsgs.has(thing.id)) { tempsMsgs.set(thing.id, thing) temps.messages.push(thing); } }) temps.messages.sort(function(a,b){ return a.timestamp.seconds - b.timestamp.seconds; }); temps.messages = temps.messages.filter((message) => { if (message.id) { return true; } return false; }) }) } })Puede consultar este tema para obtener más información sobre esto: ¿Cuál es la forma más eficiente de clonar en profundidad un objeto en JavaScript?