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

