为什么这个函数不替换关联数组中的现有值 - 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")
我已确保导入我的界面:
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")