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]
由打印结果看测试结果和原方法一致。