数组中对象元素索引获取:为何indexOf返回-1及解决办法
为什么indexOf返回-1?如何获取目标索引?
原因
JavaScript里对象属于引用类型,indexOf方法判断元素匹配时用的是**严格相等(===)**规则。
哪怕options[0]和toCheck的内容完全一样,它们也是内存中两个独立的对象,引用地址不同,所以options[0] === toCheck结果为false,indexOf找不到匹配项,自然返回-1。
解决方法
方法一:使用findIndex(推荐)
直接对比对象的关键属性来定位:
const index = options.findIndex(item => item.id === toCheck.id && item.type === toCheck.type); // 此时index的值为0,就是你要的目标索引
方法二:手动循环遍历
如果环境不支持ES6的findIndex,可以用普通循环实现:
let targetIndex = -1; for (let i = 0; i < options.length; i++) { const currentItem = options[i]; if (currentItem.id === toCheck.id && currentItem.type === toCheck.type) { targetIndex = i; break; } } // targetIndex最终会是0
方法三:深度对比所有属性(适用于复杂对象)
如果需要对比对象的所有属性是否一致,可以先实现一个简单的深度相等函数,再结合findIndex使用:
function isObjectEqual(objA, objB) { const keysA = Object.keys(objA); const keysB = Object.keys(objB); if (keysA.length !== keysB.length) return false; for (const key of keysA) { if (objA[key] !== objB[key]) return false; } return true; } const index = options.findIndex(item => isObjectEqual(item, toCheck));
内容的提问来源于stack exchange,提问作者Leo Messi
相关产品推荐
相关产品推荐

