Me aseguré de importar mi interfaz:
import { DayMoodModel } from '../objectModels/dayMood';Inicialicé la matriz de objetos con algunos datos de prueba (la propiedad de fecha tiene el tipo Fecha, en caso de que se lo pregunte):
moodsAssigned: DayMoodModel[] = [ { date: this.today, mood: 'great' } ]Esta es la función en cuestión:
addMood(moodName: string) { let obj: DayMoodModel = { date: this.currentDay, mood: moodName }; for(let i = 0; i < this.moodsAssigned.length; i++) { if(this.moodsAssigned[i].date == this.currentDay) { this.moodsAssigned[i].mood = moodName; } else if(i == this.moodsAssigned.length - 1 && this.moodsAssigned[i].date != this.currentDay) { this.moodsAssigned.push(obj); } } console.log(this.moodsAssigned); }Cuando se llama, en una fecha que ya está en la matriz de objetos, actúa como si los datos no estuvieran allí para esa fecha. Incluiré una foto del registro de la consola en la parte inferior de la publicación. En esta prueba, llamé a la función en la fecha que ya está en la matriz, esperando que reemplace el valor de 'estado de ánimo' con el nuevo estado de ánimo, pero solo agregó un nuevo objeto a la matriz.
Revisé este código varias veces, cerrando la sesión de las variables en lugares clave para asegurarme de que está leyendo todo correctamente. no se que le pasa a la logica...
El problema es que estás tratando de comparar dos objetos complejos, pero solo te importa el día, el mes y el año. Solo un == directo no va a funcionar.
Aquí hay una función de comparación adecuada de otra pregunta: ¿Cómo saber si dos fechas están en el mismo día o en la misma hora?
function sameDay(d1, d2) { return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate(); } Sin embargo, si no desea duplicados, en lugar de buscar por fuerza bruta en una matriz, puede utilizar cadenas ISO (YYYY-MM-DDTHH:MM:SS) como claves en un Map . Puede tomar los primeros 10 caracteres si no le importa la marca de tiempo.
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.component.scss'], }) export class TestComponent implements OnInit { today = this.getISO(new Date()); moodsAssigned = new Map<string, string>([ [this.today, 'great'], ]); constructor() {} ngOnInit(): void {} getISO(date: Date) { return date.toISOString().substring(0, 10); } addMood(moodName: string) { this.moodsAssigned.set(this.today, moodName); } } También puede volver a convertir una cadena ISO en un objeto de Date con el constructor de Date ; tanto AAAA-MM-DDTHH:MM:SS como AAAA-MM-DD funcionan.
const today = new Date("2022-01-30")