Array method 系列之四 —— fill & findIndex & findLastIndex & first / head
findIndex
从左向右查找数组array
中符合谓词公式predict
的元素,如存在符合要求的元素,返回元素索引号;否则返回-1。findLastIndex
和findIndex
查找顺序相似,只不过其查找顺序是从右向左。fill
方法是在[start,end)
区间里将数组元素替换成value
,注意start end
前闭后开。head
方法,也可以叫做first
方法,返回数组第一个元素。
以下是源码。
findIndex && findLastIndex
findIndex
和findLastIndex
的思路相似,都是首先确定查找的起始位置,然后利用baseFindIndex
方法进行查询。baseFindIndex
方法的思路是从起始位置依次对数组元素进行predict
判定。
/*findLastIndex*/function findLastIndex(array, predicate, fromIndex) { const length = array == null ? 0 : array.length if (!length) { return -1 } let index = length - 1 if (fromIndex !== undefined) { // index即为要查找的起始位置 index = fromIndex < 0 ? Math.max(length + fromIndex, 0) : Math.min(fromIndex, length - 1) } return baseFindIndex(array, predicate, index, true) }/*baseFindIndex*/function baseFindIndex(array, predicate, fromIndex, fromRight) { const { length } = array let index = fromIndex + (fromRight ? 1 : -1) // 遍历查询 while ((fromRight ? index-- : ++index < length)) { if (predicate(array[index], index, array)) { return index } } return -1}
fill
function fill(array, value, start, end) { var length = array == null ? 0 : array.length; if (!length) { return []; } if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { start = 0; end = length; } // 以上操作只有一个目的:确定要替换的数组元素的起始终止位置。确立起点终点之后,执行baseFill方法,进行数组元素的替换。 return baseFill(array, value, start, end); }// 元素替换baseFill方法// 其核心思路是从起点开始,对数组元素遍历,进行赋值替换。function baseFill(array, value, start, end) { var length = array.length; start = toInteger(start); if (start < 0) { start = -start > length ? 0 : (length + start); } end = (end === undefined || end > length) ? length : toInteger(end); if (end < 0) { end += length; } end = start > end ? 0 : toLength(end); // 以上是对起点终点种种非正常case的处理:如为负,终点>起点等。 // 以下是核心替换。本质是遍历赋值。 while (start < end) { array[start++] = value; } return array; }
first/head
// 第一个元素就是array[0],返回array[0];如果数组为空返回undefinedfunction head(array) { return (array != null && array.length) ? array[0] : undefined }
作者:公子七
链接:https://www.jianshu.com/p/06607ffcf19b