为什么这个函数不替换关联数组中的现有值 - Angular

Why doesn't this function replace the existing value in the associative array - Angular

我已确保导入我的界面:

import { DayMoodModel } from '../objectModels/dayMood'; 

我用一些测试数据初始化了对象数组(日期 属性 的类型是 Date,如果你想知道的话):

  moodsAssigned: DayMoodModel[] = [
    { 
      date: this.today,
      mood: 'great'
    }
  ]

这是有问题的函数:

  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);
  }

当调用时,在对象数组中已有的日期,它的行为就像该日期的数据不存在一样。我将在 post 底部附上控制台日志的照片。在这个测试中,我在数组中已经存在的日期调用了函数,期望它用新的心情替换 'mood' 值,但它只是向数组添加了一个新对象。

我已经多次检查这段代码,在关键位置注销变量以确保它正确读取所有内容。不知道逻辑有什么问题..

picture of the array logged to the console

问题是您正在尝试比较两个复杂的对象,但您只关心日、月和年。直接 == 是行不通的。

这是另一个问题的正确比较函数:

function sameDay(d1, d2) {
  return d1.getFullYear() === d2.getFullYear() &&
    d1.getMonth() === d2.getMonth() &&
    d1.getDate() === d2.getDate();
}

但是,如果您不想要重复项,而不是 brute-force 搜索数组,您可以使用 ISO 字符串 (YYYY-MM-DDTHH:MM:SS) 作为 Map 中的键.如果你不关心时间戳,你可以只取前 10 个字符。

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);
  }
}

您还可以使用 Date 构造函数将 ISO 字符串转换回 Date 对象 - YYYY-MM-DDTHH:MM:SS 和 YYYY-MM-DD 都有效。

const today = new Date("2022-01-30")