如何用forEach排除重复事件名?indexOf判断数组重复失效排查
问题分析与解决方案
为什么indexOf方法失效?
你代码里的this.events数组存储的是Event对象实例,但你用indexOf(title)查找的是字符串类型的标题。由于indexOf使用严格相等(===)比较,字符串和对象永远不相等,所以indexOf永远返回-1,导致重复事件一直能被添加,不会触发错误。
修正后的实现方法
方法1:使用findIndex判断
createNewEvent(){ let title = prompt('Name your Event: '); let date = prompt('When is your event taking place? Use MM/DD/YYYY format: '); // 查找是否存在标题相同的Event实例 const existingIndex = this.events.findIndex(event => event.title === title); if(existingIndex === -1){ this.events.push(new Event(title, date)); } else { throw new Error('Please re-name your event'); } }
方法2:使用some方法(更简洁)
createNewEvent(){ let title = prompt('Name your Event: '); let date = prompt('When is your event taking place? Use MM/DD/YYYY format: '); // 检查是否存在重复标题 const hasDuplicate = this.events.some(event => event.title === title); if(!hasDuplicate){ this.events.push(new Event(title, date)); } else { throw new Error('Please re-name your event'); } }
用forEach实现重复检测的方式
当然可以用forEach实现,核心是遍历数组时检查每个Event实例的title属性是否与输入标题一致,通过标记变量记录是否存在重复:
createNewEvent(){ let title = prompt('Name your Event: '); let date = prompt('When is your event taking place? Use MM/DD/YYYY format: '); let isDuplicate = false; this.events.forEach(event => { if(event.title === title){ isDuplicate = true; } }); if(!isDuplicate){ this.events.push(new Event(title, date)); } else { throw new Error('Please re-name your event'); } }
你之前用for循环或forEach没解决问题,应该是没正确访问Event实例的title属性,直接把数组元素(对象)和字符串标题做比较了,导致永远判定为不重复。
内容的提问来源于stack exchange,提问作者Omnipotent
相关产品推荐
相关产品推荐

