JavaScript数组:indexOf()、lastIndexOf

当我们需要查找某个值位于数组中的那个项的时候我们就可以使用indexOf、lastIndexOf方法。

indexOf 方法

返回某个值在数组中的第一个匹配项的索引。

语法
array1.indexOf(searchElement[,fromIndex])
参数

array1,必须、且为一个数组对象。
searchElement,必须,为array1中定位的值。
fromIndex,可选。用于开始搜索的数组索引。如果省略则从0处开始搜索。

返回值

indexOf返回找到第一个匹配项的索引,如果找不到指定的值则为-1。

var ar=['ab','cd','ef','ab','cd'];
console.log(ar.indexOf('cd'));//Output:1
console.log(ar.indexOf('cd',2));//output 4
console.log(ar.indexOf('cd',-2));//output 4

当fromIndex为负值的时候,用数组的长度抵消负值后的数组为fromIndex,当抵消后的值仍为负值的时候从0处开始搜索。

lastIndexOf 方法

返回指定值在数组中最后一个匹配项的索引。

语法
array1.lastIndexOf(searchElement[,fromIndex])
参数

array1,必须、且为一个数组对象
searchElement,必须,为array1中定位的值。
fromIndex,可选。用于开始搜索的数组的索引。如果省略,则搜索将从数组中的最后一个索引处开始。

返回值

数组中的searchElement的最后一个匹配项的索引。如果为找到则返回-1;

var ar=['ab','cd','ab','ef','cd'];
console.log(ar.lastIndexOf('ab'));//Output:2
console.log(ar.lastIndexOf('ab',2));//output -1
console.log(ar.lastIndexOf('ab',-1));//output -1

fromIndex参数存在的时候,是从后向前检索匹配,找到第一个匹配的值。即整个数组中最后一个匹配的项。
搜索按降序索引顺序进行。首先搜索最后一个成员。indexOf则采用升序检索。
如果fromIndex大于或等于数组长度,则搜索整个数组。如果fromIndex为负,则搜索从数组长度加上fromIndex的位置处开始,如果计算所得的索引小于0,则返回-1;

兼容性

indexOf和lastIndexOf方法在ie9+浏览器支持。如果希望能在低版本浏览器支持indexOf,可以添加下面部分代码:摘自mdn

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

lastIndexof
Polyfill

if (!Array.prototype.lastIndexOf) {
  Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
    'use strict';

    if (this === void 0 || this === null) {
      throw new TypeError();
    }

    var n, k,
        t = Object(this),
        len = t.length >>> 0;
    if (len === 0) {
      return -1;
    }

    n = len - 1;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n) {
        n = 0;
      }
      else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
      }
    }

    for (k = n >= 0
          ? Math.min(n, len - 1)
          : len - Math.abs(n); k >= 0; k--) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  };
}

总结:indexOf()和lastIndexOf()两个方法都是用来查找数组项在一个数组中的索引值,其中indexOf()是从前向后寻找,而lastIndexOf()是从后向前寻找。
indexOf返回某值在数组中项的索引,未找到返回-1,第二个参数为检索的起始项,当检索起始项为负值时候,用数组length加上负值得到的值为项的起始索引,若仍旧小于0则从第一项开始检索。
lastIndexOf返回匹配值的最后一项的索引。当有第二个参数时候,是从数组的最后项数向前的个数开始检索。若为负数则用数组的长度匹配后为检索开始位置,仍为0的时候返回-1;

    原文作者:Alee文润
    原文地址: https://www.jianshu.com/p/3b2fe678600c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞