继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

每天一个lodash方法(4)

DIEA
关注TA
已关注
手记 412
粉丝 63
获赞 387

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];如果数组为空返回undefinedfunction head(array) {  return (array != null && array.length)
    ? array[0]
    : undefined
}



作者:公子七
链接:https://www.jianshu.com/p/06607ffcf19b


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP