MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

正在翻譯中。

 

findIndex() 方法將依據提供的測試函式,尋找陣列中符合的元素,並返回其 index(鍵值)。如果沒有符合的對象,將返回 -1 。

function isBigEnough(element) {
  return element >= 15;
}

[12, 5, 8, 130, 44].findIndex(isBigEnough); // index of 3rd element in the Array is returned, it will result in '3'

另請參見 find() 方法,它返回數組中找到的元素的值,而不是其索引。

語法

arr.findIndex(callback[, thisArg])

參數

callback
針對數組中的每個元素, 都會執行該回調函數, 執行時會自動傳入下面三個參數:
element
當前元素.
index
當前元素的索引.
array
調用findIndex的數組.
thisArg
可選的。執行 callback 時作為 this對象 的值.

回傳值

An index in the array if an element passes the test; otherwise, -1.

描述

findIndex 方法對數組中的每一個元素執行一次回調函數直至有一個回調函數返回真值 。如果找到了一個這樣的元素, 則 findIndex 將會立刻返回這個元素的索引。否則 findIndex 將會返回 -1。不像其他的數組方法如some那樣,該方法的callback總是被調用,即使該索引在數組中並不存在(譯者註:既對於被刪除或空位置的索引處仍然調用callback)。

回調函數調用時有三個參數:元素的值,元素的索引,以及被遍歷的數組。

如果一個 thisArg 參數被提供給 findIndex, 它將會被當作 this 使用在每次回調函數被調用的時候。如果沒有被提供,將會使用undefined

findIndex 不會修改所調用的數組。

在第一次調用callback函數時會確定元素的索引範圍,因此在findIndex方法開始執行之後添加到數組的新元素將不會被callback函數訪問到。如果數組中一個尚未被callback函數訪問到的元素的值被callback函數所改變,那麼當callback函數訪問到它時,它的值是將是根據它在數組中的索引所訪問到的當前值。被刪除的元素不會被訪問到。

範例

查找數組中首個質數元素的索引

下面的示例演示瞭如何查找一個數組中首個質數元素的索引, 找不到則返回 -1.

function isPrime(element, index, array) {
  var start = 2;
  while (start <= Math.sqrt(element)) {
    if (element % start++ < 1) {
      return false;
    }
  }
  return element > 1;
}

console.log([4, 6, 8, 12].findIndex(isPrime)); // -1, not found
console.log([4, 6, 7, 12].findIndex(isPrime)); // 2

Polyfill

// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
if (!Array.prototype.findIndex) {
  Object.defineProperty(Array.prototype, 'findIndex', {
    value: function(predicate) {
     // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return k.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return k;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return -1.
      return -1;
    }
  });
}

If you need to support truly obsolete JavaScript engines that don't support Object.defineProperty, it's best not to polyfill Array.prototype methods at all, as you can't make them non-enumerable.

規範

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.
Living Standard  

瀏覽器相容性

Feature Chrome Firefox (Gecko) Internet Explorer Edge Opera Safari
Basic support 45.0 25.0 (25.0) No support Yes Yes 7.1
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support No support No support 25.0 (25.0) No support No support 8.0

參見

文件標籤與貢獻者

 此頁面的貢獻者: auver, jackblackevo, Snailpool
 最近更新: auver,