功能: 返回第一个满足条件的元素下标。
实现注意:
1. 没有条件满足返回-1
1. 数组长度为0 返回 -1
1. 符合条件就停止遍历
1. 稀疏数组正常遍历
1. findIndex 在第一次调用回调函数的时候确认了数组的长度
// Array.prototype.findIndex ES2015 ES6
var arr = [1, 2, 3, 4, 5];
// 1.返回第一个满足条件元素的索引。
var idx = arr.findIndex(function (item,idx,arr) {
return item > 2;
})
console.log(item);// 2
// 2.如果没有一个元素满足条件 返回-1;
// 3.数组长度为0 返回的也是 -1
var idx = arr.findIndex(function (item,idx,arr) {
return item > 20;
})
console.log(idx) // -1
// 4.1 稀疏数组是正常遍历空隙
// 4.2 空隙将会被填充为undefined
// 4.3 findIndex 如果返回true,就会停止遍历。
var arr1 = [1,,3,,5,,7,,9];
arr1.findIndex(function (item, idx, arr) {
console.log(item);// 空隙被填充为undefined
return item === 5;
})
// 3.参数
// 参数1 回调函数 cb(item,idx,arr);
// item-> 当前项, idx-> 数组的索引 arr->数组本身
// 回调函数内部是无法改变数组元素的值.
// 回调函数返回值 bool 返回 true 停止遍历
// 参数2 更改findIndex 函数内部 this指向;
// 默认情况下 this -> window
// 严格模式下 this === undefined
var idx = arr.findIndex(function (item,idx,arr) {
})
// 6. 回调函数中虽然数组增加了元素,但是函数只会遍历最初数组的长度
// findIndex 在第一次调用回调函数的时候确认了数组的长度
var idx = arr.findIndex(function (item,idx,arr) {
if(idx === 0){
arr.splice(1,1);// 最后走的一次。 补undefined。实际数组对应下标被删除
delete arr[1];// 删除元素对应下标的值 并补undefined 实际数组对应下标变成empty
arr.pop(); // 删除元素下标对应的值。补undefined 实际数组被删除最后一个
}
})
// demo1
var idx = [1,2,3,4,5].findIndex(function(item,id,arr){
if(id === 0){
arr.splice(1,1);
arr.push(6);
}
console.log(item); // push 6 的情况下 1, 3, 4, 5, 6;
// 不push6的情况下 1, 3, 4, 5, undefined
})
// findIndex polyfill
Array.prototype.myFindIndex = function (cb) {
if(this === null){
throw new TypeError ('this is not allowed to be null');
}
if(typeof cb !== 'function'){
throw new TypeError (cb +' is not a function')
}
var obj = Object(this),
len = obj.length >>>0,
step = 0,
arg2 = arguments[1],
item;
while (step < len){
item = obj[step];
if(cb.apply(arg2,[item, step, obj])){
return step;
}
step ++; // 步数加加
}
return -1;
}