对象比较失效求助:判断对象是否存在于对象数组中
解决对象数组中判断重复对象的问题
你遇到的核心问题是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
相关产品推荐
相关产品推荐

