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

对象比较失效求助:判断对象是否存在于对象数组中

解决对象数组中判断重复对象的问题

你遇到的核心问题是JavaScript中对象的引用比较特性:===运算符对于对象来说,比较的是两个变量是否指向内存中的同一个对象实例,而不是它们的内容是否一致。哪怕两个对象的键值对完全相同,只要是分别创建的独立对象,===就会返回false,这就是你的代码里if(bet === tempBet)永远不会触发的原因。

下面给你几个实用的解决方案,按推荐程度排序:

1. 基于唯一标识属性判断(最可靠高效)

如果你的投注对象(bet和tempBet)有唯一标识的属性(比如betId、uniqueKey这类不会重复的字段),直接用这个属性比较是最优解:

// 用Array.some()替代手动循环,更简洁
const duplicate = this.betTemps.some(bet => bet.betId === tempBet.betId);

if (duplicate) {
    alert("The Bet is already...");
}

some()方法会遍历数组,只要找到第一个满足条件的元素就会返回true,自动终止遍历,比手动写循环更高效简洁。

2. 比较对象的核心属性

如果没有唯一标识,就比较所有能确定投注唯一性的核心属性(比如投注金额、类型、赛事ID等):

const duplicate = this.betTemps.some(bet => 
    bet.amount === tempBet.amount &&
    bet.matchId === tempBet.matchId &&
    bet.betType === tempBet.betType
);

这种方式比全量比较所有属性更高效,也能避免一些无关属性(比如创建时间)的干扰。

3. 用JSON.stringify()比较(仅适用于简单纯数据对象)

如果你的对象是纯数据类型(没有函数、undefined、Date这类特殊值),可以把对象转成JSON字符串再比较:

const duplicate = this.betTemps.some(bet => 
    JSON.stringify(bet) === JSON.stringify(tempBet)
);

⚠️ 注意:这个方法有局限性——如果对象属性的顺序不同(比如一个是{id:1, amount:10},另一个是{amount:10, id:1}),转成字符串后会不相等;而且函数、undefined等会被JSON.stringify()忽略,导致判断不准确,所以只适合简单场景。

最后给你提个小建议:以后遇到对象比较的问题,先记住引用类型比的是地址,值类型比的是内容,就能快速定位问题啦~

内容的提问来源于stack exchange,提问作者filip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:13