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

Ionic3中数组对象indexOf查找失效,始终返回-1求排查

排查indexOf返回-1的问题

兄弟,我看你遇到的问题是用indexOf找对象索引一直返回-1,这大概率是对象引用不匹配导致的,我给你拆解下原因和解决方案:

核心原因:对象的严格相等判断

indexOf是用**严格相等(===)**来匹配元素的,对于对象来说,哪怕两个对象的属性完全一样,只要它们是不同的引用(也就是不是同一个内存地址的对象),===就会返回false,自然indexOf找不到,返回-1。

看你的代码里,每次都会新建一个对象:

this.checkedCategoryObject = { 
  "id" : subCategroyObject.keyId, 
  "subCategoryName" : subCategroyObject.subCategoryName 
}

如果你之后用这个新创建的对象去数组里indexOf,哪怕数组里有属性完全一样的对象,它们也是不同的引用,肯定匹配不上。

解决方案

根据你的场景,有两种常用的解决方式:

1. 用findIndex根据对象的唯一标识查找(推荐)

既然你的对象有唯一的id(也就是subCategroyObject.keyId),直接用findIndex自定义匹配条件就行,不用管对象引用:

// 假设你的目标数组是this.selectedSubCategories
const targetIndex = this.selectedSubCategories.findIndex(item => item.id === subCategroyObject.keyId);
// 或者用你新建的checkedCategoryObject的id也行
const targetIndex = this.selectedSubCategories.findIndex(item => item.id === this.checkedCategoryObject.id);

这样只要id匹配,就能找到对应的索引,完全不受对象引用的影响。

2. 确保查找的是数组里的同一个引用

如果你一定要用indexOf,那你要保证你查找的对象就是数组里已经存在的那个引用,而不是新创建的。比如:

// 当你push对象到数组时,先把这个对象存起来
const newObj = { 
  "id" : subCategroyObject.keyId, 
  "subCategoryName" : subCategroyObject.subCategoryName 
};
this.selectedSubCategories.push(newObj);
// 之后找索引的时候,直接用这个newObj去indexOf
const targetIndex = this.selectedSubCategories.indexOf(newObj);

这样因为是同一个引用,indexOf就能正确找到索引了。

结合你的代码场景补充

看你的代码里提到Push only if ...,应该是要把对象push到某个数组里,之后想判断这个对象是否已经在数组里?如果是这种场景,也可以用some方法快速判断:

const isExist = this.selectedSubCategories.some(item => item.id === subCategroyObject.keyId);
if (!isExist) {
  // 不存在就push
  this.selectedSubCategories.push(this.checkedCategoryObject);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:45:09