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

14 浏览
0 Comments

为什么这个函数不能替换关联数组中现有的值- 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);
  }

当在数组中已有该日期的情况下调用该函数时,它会像该数据还没有存在于该日期一样进行。本文末尾会附上控制台记录的照片。在这个测试中,我在已经存在于数组中的日期上调用函数,期望它将“情绪”值替换为新的情绪,但它只是向数组中添加了一个新对象。

我已经多次检查了这段代码,记录了关键位置的变量以确保它正常读取一切。我不知道逻辑有什么问题。

记录在控制台中的数组的图片

admin 更改状态以发布 2023年5月24日
0
0 Comments

问题在于你试图比较两个复杂的对象,但你只关心日期、月份和年份。直接使用 == 是无法完成工作的。

另一个问题中提供了一个适当的比较函数:如何判断两个日期是否在同一天或同一个小时?

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

然而,如果你不想要重复,而不是强制在数组中搜索,你可以利用 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([
    [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")

0