You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:10:38