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

JavaScript检查对象数组是否包含指定对象时indexOf返回-1问题求解

问题原因

Array.indexOf() 方法的匹配逻辑是严格相等(===),对于引用类型(对象、数组、类实例等),严格相等判断的是两个变量是否指向内存中的同一个引用地址,而非对比对象的内部属性值。
你当前场景下:

  • 变量u是独立创建的普通对象{id: 2}
  • formation.users里的是User类的实例对象,哪怕id属性和u完全一致,二者也是内存地址完全不同的两个独立对象,所以indexOf匹配失败返回-1。控制台打印的是对象序列化后的内容,只能说明属性值相同,不能证明是同一个引用对象。
解决方案

方案1:按属性匹配判断(推荐)

如果只需要判断用户是否在数组中,使用Array.some()方法对比唯一标识id即可:

const isUserIncluded = formation.users.some(item => item.id === u.id);
// 匹配成功返回true,失败返回false

如果需要拿到对应匹配项的索引,使用Array.findIndex(),返回规则和indexOf完全一致:

const userIndex = formation.users.findIndex(item => item.id === u.id);

如果需要拿到匹配的完整对象,使用Array.find():

const matchedUser = formation.users.find(item => item.id === u.id);
// 匹配成功返回对应对象,失败返回undefined

方案2:保证引用一致

如果必须要使用indexOf,需要确保变量u是直接从formation.users数组中取出的实例,二者指向同一个内存引用,此时indexOf才能返回正确的索引:

// 示例:从数组中取出u
const u = formation.users[0];
console.log(formation.users.indexOf(u)); // 此时返回0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:57:03