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
相关产品推荐
相关产品推荐

