js中数组indexOf方法的使用和实现

js中数组indexOf方法的使用和实现

IndexOf方法定义

indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

IndexOf方法语法

arr.indexOf(searchElement[, fromIndex])

参数

searchElement
要查找的元素

fromIndex 可选
开始查找的位置(默认从0 开始)。

返回值

首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1

详细描述

indexOf方法查找到第一个传入的元素,并返回当前元素的索引,如果没找到就就返回-1。

它有两个参数:
searchElement 要查找的元素
fromIndex 非必填
开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.

使用示例

查询元素在数组中的位置

    let arr1 = ['a', 'b', 'c']
    const r1 = arr1.indexOf('a')
    console.log(r1) // 0
    const r2 = arr1.indexOf('a', 1)
    console.log(r2) // -1
    const r3 = arr1.indexOf('a', -1)
    console.log(r3) // -1

    const r4 = arr1.indexOf('c')
    console.log(r4) // 2
    const r5 = arr1.indexOf('c', 1)
    console.log(r5) // 2
    const r6 = arr1.indexOf('c', -1)
    console.log(r6) // 2

找出指定元素出现的所有位置

    let indexList = [];
    let arr2 = ['a', 'b', 'a', 'c', 'a', 'd'];
    let element = 'a';
    let index = arr2.indexOf(element);
    while (index !== -1) {
        indexList.push(index);
        index = arr2.indexOf(element, index + 1);
    }
    console.log(indexList);
    // [0, 2, 4]

上述代码会查找出指定元素在数组中出现的所有位置。根据上述用法和描述来模拟实现自己的indexOf方法。

步骤思路

1、将自己的方法挂在到数组的原型上
2、传入搜寻的参数和起始索引
3、判断数组长度是否为0,或者传入的fromIndex 是否大于数组长度
4、处理fromIndex 传入为负数情况
5、循环判断传入的元素是否相当,返回当前元素索引

实现代码
    Array.prototype.myIndexOf = function(searchElement, fromIndex ) {
        let length = this.length
        let fi = +fromIndex || 0
        if (fi > length || length === 0) return -1
        // 处理传入fromIndex为负数的情况
        fi = fi >= 0? fi: length - Math.abs(fi)
        for (let index = fi; index < length; index++) {
            if (this[index] === searchElement) return index
        }
        return -1
    }
测试验证
    Array.prototype.myIndexOf = function(searchElement, fromIndex ) {
        let length = this.length
        let fi = +fromIndex || 0
        if (fi > length || length === 0) return -1
        // 处理传入fromIndex为负数的情况
        fi = fi >= 0? fi: length - Math.abs(fi)
        for (let index = fi; index < length; index++) {
            if (this[index] === searchElement) return index
        }
        return -1
    }

    let arr1 = ['a', 'b', 'c']
    const r1 = arr1.myIndexOf('a')
    console.log(r1) // 0
    const r2 = arr1.myIndexOf('a', 1)
    console.log(r2) // -1
    const r3 = arr1.myIndexOf('a', -1)
    console.log(r3) // -1

    const r4 = arr1.myIndexOf('c')
    console.log(r4) // 2
    const r5 = arr1.myIndexOf('c', 1)
    console.log(r5) // 2
    const r6 = arr1.myIndexOf('c', -1)
    console.log(r6) // 2

    const r7 = arr1.myIndexOf('d')
    console.log(r7) // -1

    let indexList = [];
    let arr2 = ['a', 'b', 'a', 'c', 'a', 'd'];
    let element = 'a';
    let index = arr2.myIndexOf(element);
    while (index !== -1) {
        indexList.push(index);
        index = arr2.myIndexOf(element, index + 1);
    }
    console.log(indexList);
    // [0, 2, 4]

由打印结果看测试结果和原方法一致。

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值