Array.prototype.findIndex()

242 阅读1分钟

findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。

const array = [5, 12, 8, 130, 44]

const isLargeNumber = (element) => element > 13

console.log(array.findIndex(isLargeNumber)) // 3

findIndex方法对数组中的每个数组索引0..length-1(包括)执行一次callback函数,直到找到一个callback函数返回真实值(强制为true)的值。如果找到这样的元素,findIndex会立即返回该元素的索引。如果回调从不返回真值,或者数组的length为0,则findIndex返回-1。 与某些其他数组方法(如Array#some)不同,在稀疏数组中,即使对于数组中不存在的条目的索引也会调用回调函数。

回调函数调用时有三个参数:元素的值,元素的索引,以及被遍历的数组。

如果一个 thisArg 参数被提供给 findIndex, 它将会被当作this使用在每次回调函数被调用的时候。如果没有被提供,将会使用undefined。

findIndex不会修改所调用的数组。

在第一次调用callback函数时会确定元素的索引范围,因此在findIndex方法开始执行之后添加到数组的新元素将不会被callback函数访问到。如果数组中一个尚未被callback函数访问到的元素的值被callback函数所改变,那么当callback函数访问到它时,它的值是将是根据它在数组中的索引所访问到的当前值。被删除的元素仍然会被访问到。

实现Array.prototype.findIndex()

Array.prototype.myFindIndex = function(cb) {
    if (this === null) {
        return new TypeError('Type Error')
    }
    if (typeof cb === 'function') {
        return new TypeError('CallBack must be function Type')
        
    const obj = Object(this)
    const len = obj.length >>> 0
    const arg2 = arguments[1]
    let step = 0
    
    while(step < len) {
        let value = obj[step]
        if (cb.apply(arg2, [value, step, obj]) {
            return step
        }
        step++
    }
    return -1
}
const arr = [1, 2, 3, 4, 5]
const res = arr.myFindIndex(function(item) {
    return item > -1
})