最近遇到一个问题,某个地方有错误,经排查是 findIndex 和 indexOf 函数错误使用的问题,记录一下。
indexOf 和 findIndex 都是数组方法,用于查找元素在数组中的索引。
indexOf
indexOf 方法返回数组中第一个元素的索引,如果找不到则返回 -1。它使用严格相等 (===) 进行比较。
const arr = [1, 2, 3, 4, 5];
console.log(arr.indexOf(3)); // 2
console.log(arr.indexOf(6)); // -1
findIndex
findIndex 方法返回数组中第一个元素的索引,如果找不到则返回 -1。它使用回调函数进行比较,可以实现更复杂的查找逻辑。
const arr = [1, 2, 3, 4, 5];
console.log(arr.findIndex(x => x > 3)); // 3
console.log(arr.findIndex(x => x > 5)); // -1
总结
indexOf 适用于简单的值查找,使用严格相等进行比较。
findIndex 适用于复杂的查找逻辑,使用回调函数进行比较。
简单的查找(无重复的字符串和数字),选择 indexOf 。
复杂的查找(数组嵌套对象或者数组),选择 findIndex 。
问题反思
上面的理论看起来很简单,也不容易犯错,我遇到的情况是:
某个数据结构,数组内部每一项是对象。
早期使用 findIndex 进行查询:某些情况下,查询时对象的属性不变,那么 Index 可以找到,正确。某些情况下,查询时对象属性变化了,那么 findIndex 使用 === 进行比较,就找不到原来的对象。
页面的现象是:问题不稳定复现,需要一定时间才查出问题。
修改
使用 findIndex 查找,当 object.id 相等时返回 Index。