摘要:学习冴羽的博客在数组中查找指定元素
ES6中的findIndex
ES6的findIndex方法会返回数组中满足提供的函数的第一个元素的索引,否则返回 -1
1 | var arr = [0, 1, 2, 3, 4, 5, 6]; |
实现findIndex与findLastIndex
正序查找findIndex
1 | // 目标数组,条件函数,this指向 |
倒序查找findLastIndex
1 | function findLastIndex(array, predicate, context) { |
精简createIndexFinder
结合正序和倒序实现一个利用参数的不同,返回不同函数的方法(underscore)
1 | // dir为1时是正序,-1时是倒序 |
sortedIndex
在一个排好序的数组中插入值,保证插入后数组仍是有序状态。有序数组可以使用二分法加快速度
1 | function sortedIndex(array, number) { |
如果数组元素是个对象,想要按照某个属性值来排序怎么办?需要一个方法将数组的每一个元素都进行处理并返回关键属性值(注意 this 的指向),然后按照上面的方法进行排序
1 | function cb(fn, context) { |
实现 indexOf 与 lastIndexOf
参照 findIndex 和 FindLastIndex 的方式,写一个可以生成 indexOf 和 lastIndexOf 的方法
1 | function createIndexOfFinder(dir) { |
但是 indexOf 还可以传递第二个参数 fromIndex,用于控制查找范围
设定开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1 表示从最后一个元素开始查找,-2 表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,仍然从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0。
lastIndexOf的fromIndex
从此位置开始逆向查找。默认为数组的长度减1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回-1,即数组不会被查找。
1 | function createIndexOfFinder(dir) { |
优化
underscore在此基础上还做了两点优化:
1.支持查找 NaN
利用 NaN !== NaN 的特性来判断要查询的元素是不是 NaN,如果是就用上面的 findIndex/findLastIndex 查找并返回该元素的索引
1 | function createIndexOfFinder(dir, predicate) { |
2.支持对有序数组进行更快的二分查找
当对有序数组进行正想查找时,返回的函数(indexOf)的第三个参数不是数值而是布尔 true,就认为数组是一个排好序的数组,调用 sortedIndex 采用用二分法进行更快的查询
1 | function createIndexOfFinder(dir, predicate, sortedIndex) { |