为什么这个函数不能替换关联数组中现有的值- Angular
为什么这个函数不能替换关联数组中现有的值- 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日
问题在于你试图比较两个复杂的对象,但你只关心日期、月份和年份。直接使用 ==
是无法完成工作的。
另一个问题中提供了一个适当的比较函数:如何判断两个日期是否在同一天或同一个小时?
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")