Angular:addMood函数无法替换对象数组中已有日期对应情绪值问题求助
问题分析与解决方案
你的问题核心在于Date对象的比较方式错误,再加上循环逻辑的漏洞,导致程序无法识别数组中已存在的日期。
为什么日期匹配会失败?
在JavaScript/TypeScript里,Date属于引用类型,用==或者===比较时,判断的是两个对象是否指向同一个内存引用,而不是它们代表的日期值是否相同。哪怕两个Date对象的时间完全一致,只要不是同一个实例,==就会返回false。
比如你代码里的this.moodsAssigned[i].date == this.currentDay,就算日期值完全一样,只要是不同的Date实例,这个判断就会失败,程序自然会认为该日期不存在,进而执行新增对象的逻辑。
循环逻辑的额外隐患
你写的else if条件还有个问题:就算前面已经找到匹配的日期并完成更新,只要循环走到最后一个元素且该元素日期不匹配,就会再次触发新增操作。比如数组有多个元素时,第一个元素匹配更新了,但最后一个元素不匹配,就会导致重复新增数据。
修复后的代码
我们可以调整逻辑:先遍历数组查找目标日期,找到就更新;遍历结束后如果没找到,再新增对象。同时用正确的方式比较日期:
addMood(moodName: string) { // 标记是否找到匹配的日期 let found = false; // 用getTime()获取时间戳,以此判断日期是否相等 const targetTime = this.currentDay.getTime(); for(let i = 0; i < this.moodsAssigned.length; i++) { if(this.moodsAssigned[i].date.getTime() === targetTime) { this.moodsAssigned[i].mood = moodName; found = true; break; // 找到后直接跳出循环,不用继续遍历 } } // 遍历完都没找到,再新增对象 if(!found) { const obj: DayMoodModel = { date: this.currentDay, mood: moodName }; this.moodsAssigned.push(obj); } console.log(this.moodsAssigned); }
其他可选的日期比较方式
除了getTime(),你也可以用toISOString()把Date转为标准格式的字符串来比较:
if(this.moodsAssigned[i].date.toISOString() === this.currentDay.toISOString()) { // ...执行更新逻辑 }
更简洁的写法(可选)
用数组的find方法能让代码更清爽:
addMood(moodName: string) { const targetTime = this.currentDay.getTime(); const existingMood = this.moodsAssigned.find(item => item.date.getTime() === targetTime); if(existingMood) { existingMood.mood = moodName; } else { this.moodsAssigned.push({ date: this.currentDay, mood: moodName }); } console.log(this.moodsAssigned); }
这样修改后,就能正确识别已存在的日期并更新对应的mood值,不会再出现重复新增的问题了。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

