美文网首页让前端飞
每天一个lodash方法(4)

每天一个lodash方法(4)

作者: 公子七 | 来源:发表于2018-08-22 11:55 被阅读10次

    Array method 系列之四 —— fill & findIndex & findLastIndex & first / head

    • findIndex从左向右查找数组array中符合谓词公式predict的元素,如存在符合要求的元素,返回元素索引号;否则返回-1。
    • findLastIndexfindIndex查找顺序相似,只不过其查找顺序是从右向左。
    • fill方法是在[start,end)区间里将数组元素替换成value,注意start end前闭后开。
    • head方法,也可以叫做first方法,返回数组第一个元素。

    以下是源码。

    findIndex && findLastIndex

    findIndexfindLastIndex的思路相似,都是首先确定查找的起始位置,然后利用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];如果数组为空返回undefined
    function head(array) {
      return (array != null && array.length)
        ? array[0]
        : undefined
    }
    

    相关文章

      网友评论

        本文标题:每天一个lodash方法(4)

        本文链接:https://www.haomeiwen.com/subject/ljyeiftx.html