数组存在目标元素但findIndex()返回-1,求问题排查与解决
问题排查:
findIndex 返回 -1 但控制台显示目标元素存在 核心陷阱:控制台打印的是引用的最新状态,而非代码执行时的状态
先看你的代码执行顺序:
// 1. 先执行查找逻辑 let iToUpdateIndex = this.instructions.findIndex(known_i => known_i.src_id == i.src_id); // 2. 再打印日志 console.log('i: ',i) console.log('this.instructions: ',this.instructions); console.log('iToUpdateIndex: ', iToUpdateIndex);
这里藏着一个非常容易踩的控制台坑:console.log 打印数组、对象这类引用类型时,显示的是你打开控制台查看日志时的最新状态,不是执行 console.log 那一行代码时的状态。
换句话说,当 findIndex 执行的时候,this.instructions 里还没有那个 src_id=1 的元素;但在 findIndex 执行完成、console.log 执行之前的这段时间里,有其他代码修改了 this.instructions,把目标元素加了进去。所以你在控制台看到的是修改后的数组,而 iToUpdateIndex 拿到的是修改前的查找结果。
验证方法
你可以把日志挪到 findIndex 之前,或者用深拷贝打印执行时的快照,避免引用带来的误导:
// 先打印执行findIndex时的快照,再执行查找 console.log('查找前的instructions快照:', JSON.parse(JSON.stringify(this.instructions))); console.log('当前i的快照:', JSON.parse(JSON.stringify(i))); let iToUpdateIndex = this.instructions.findIndex(known_i => known_i.src_id == i.src_id); console.log('iToUpdateIndex: ', iToUpdateIndex);
这样打印出来的就是 findIndex 执行那一刻的真实状态,能直接确认当时数组里到底有没有目标元素。
其他可能的排查方向
如果上面的验证显示执行 findIndex 时数组确实存在目标元素,再检查这两个点:
- 类型不匹配:虽然控制台显示都是
1,但有可能一个是数字类型number,一个是字符串类型string(比如i.src_id是1,数组里的是"1")。建议改用严格相等===比较,同时打印类型确认:console.log('i.src_id的类型:', typeof i.src_id); this.instructions.forEach(item => console.log('数组元素src_id的类型:', typeof item.src_id)); - 属性枚举问题:有没有可能
src_id是不可枚举属性?不过从控制台显示来看可能性极低,但可以在findIndex的回调里用Object.hasOwn(known_i, 'src_id')确认属性是否存在。
内容的提问来源于stack exchange,提问作者yosra
相关产品推荐
相关产品推荐

