_.indexOf(array, value, [fromIndex=0])

19

_.indexOf(array, value, [fromIndex=0])

_.indexOf方法返回在数组中可以找到一个给定元素的第一个索引,使用SameValueZero来比较两个值是否相等

参数

array (Array): 需要查找的数组
value (*): 查找的元素
[fromIndex=0] (number): 查找的起始位置

返回值

(number):返回找到的第一个元素的索引,否则返回-1

例子

_.indexOf([1, 2, 1, 2], 2);
// => 1
 
// Search from the `fromIndex`.
_.indexOf([1, 2, 1, 2], 2, 2);
// => 3

源代码:

import baseIndexOf from './.internal/baseIndexOf.js'

/**
 * Gets the index at which the first occurrence of `value` is found in `array`
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons. If `fromIndex` is negative, it's used as the
 * offset from the end of `array`.
 *
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} [fromIndex=0] The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 * @example
 *
 * indexOf([1, 2, 1, 2], 2)
 * // => 1
 *
 * // Search from the `fromIndex`.
 * indexOf([1, 2, 1, 2], 2, 2)
 * // => 3
 */
//indexOf方法返回在数组中可以找到一个给定元素的第一个索引,使用SameValueZero来比较两个值是否相等
function indexOf(array, value, fromIndex) {
  const length = array == null ? 0 : array.length//数组长度
  if (!length) {//数组长度为0,返回-1
    return -1
  }
  let index = fromIndex == null ? 0 : +fromIndex//查找的起始位置,如果没有fromIndex,就从0开始,如果有,就转成number类型
  if (index < 0) {//处理起始位置是负数情况
    index = Math.max(length + index, 0)
  }
  return baseIndexOf(array, value, index)//调用baseIndexOf
}

export default indexOf

下面是baseIndexOf:

import baseFindIndex from './baseFindIndex.js'
import baseIsNaN from './baseIsNaN.js'//判断一个值是不是NaN
import strictIndexOf from './strictIndexOf.js'

/**
 * The base implementation of `indexOf` without `fromIndex` bounds checks.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
//寻找数组中指定值的位置,找不到返回-1,fromIndex是查找起始位置
function baseIndexOf(array, value, fromIndex) {
  return value === value
    ? strictIndexOf(array, value, fromIndex)
    : baseFindIndex(array, baseIsNaN, fromIndex)
    //如果value是NaN就调用baseFindIndex查找,传入的回调函数是自己实现的isNaN
    //如果value不是NaN就调用strictIndexOf查找
}

export default baseIndexOf

下面是baseFindIndex:

/**
 * The base implementation of `findIndex` and `findLastIndex`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} predicate The function invoked per iteration.
 * @param {number} fromIndex The index to search from.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
//_.findIndex和_.findLastIndex的基础实现
//array查找的数组,predicate每次循环调用的函数,fromIndex遍历的起始位置,fromRight是否反向查找
function baseFindIndex(array, predicate, fromIndex, fromRight) {
  const { length } = array//数组长度
  let index = fromIndex + (fromRight ? 1 : -1)//循环索引,如果反向循环就加1,如果正向就减1

  while ((fromRight ? index-- : ++index < length)) {//正向就++,反向--
    if (predicate(array[index], index, array)) {//调用predicate,根据其返回的真假值,如果返回true说明找到了
      return index
    }
  }
  return -1//找不到返回-1
}

export default baseFindIndex

下面是baseIsNaN:

/**
 * The base implementation of `isNaN` without support for number objects.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 */
//判断一个之是不是NaN
function baseIsNaN(value) {
  return value !== value
}

export default baseIsNaN

下面是strictIndexOf:

/**
 * A specialized version of `indexOf` which performs strict equality
 * comparisons of values, i.e. `===`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
//indexOf实现,使用严格等于来判断值是否相等
function strictIndexOf(array, value, fromIndex) {
  let index = fromIndex - 1//循环索引
  const { length } = array//数组长度

  while (++index < length) {
    if (array[index] === value) {//如果当前值严格等于value,就返回index索引
      return index
    }
  }
  return -1//找不到返回-1
}

export default strictIndexOf

 

 

posted @ 2018-10-11 14:29  hahazexia  阅读(1021)  评论(0)    收藏  举报