Метод indexOf() повертає перший індекс, за яким даний елемент був знайдений в масиві, а якщо він відсутній, то повертає -1.

Примітка: Щодо метода String, дивіться String.prototype.indexOf().

var a = [2, 9, 9]; 
a.indexOf(2); // 0 
a.indexOf(7); // -1

if (a.indexOf(7) === -1) {
  // елемент не існує у масиві
}

Синтаксис

arr.indexOf(searchElement[, fromIndex])

Параметри

searchElement
Елемент, який потрібно знайти.
fromIndex Optional
Індекс, з якого починається пошук. Якщо індекс більше або дорівнює довжині масиву, повертається  -1, що означає, що масив не буде шукатися. Якщо значення показника є від'ємним числом, то воно трактується як зміщення від кінця масиву.
Примітка: якщо наданий індекс від'ємний, масив все ще ітерується спереду назад. Якщо індекс  рівний 0, то буде проведений пошук по всьому масиву. За замовчуванням: 0 (виконується пошук по всьому масиву).

Значення, яке повертається

Перший індекс елемента в масиві; якщо не знайдено, то -1.

Опис

indexOf() порівнює searchElement з елементами Масиву, використовуючи строгу рівність (той самий метод, що використовується з допомогою === або потрійним дорівнює).

Приклад

Використання indexOf()

У наступному прикладі indexOf() використовується для пошуку значень в масиві.

var array = [2, 9, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0

Пошук всіх відопвідностей на елементі

var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
  indices.push(idx);
  idx = array.indexOf(element, idx + 1);
}
console.log(indices);
// [0, 2, 4]

Пошук, чи існує елемент в масиві, і його оновлення 

function updateVegetablesCollection (veggies, veggie) {
    if (veggies.indexOf(veggie) === -1) {
        veggies.push(veggie);
        console.log('Оновлений набір овочів : ' + veggies);
    } else if (veggies.indexOf(veggie) > -1) {
        console.log(veggie + ' вже існує у наборі овочів.');
    }
}

var veggies = ['картопля', 'помідор', 'чилі', 'зелений перець'];

updateVegetablesCollection(veggies, 'шпинат'); 
// Оновлений набір овочів: картопля,помідор,чилі,зелений перець,шпинат
updateVegetablesCollection(veggies, 'шпинат'); 
// шпинат вже існує у наборі овочів.

Поліфіл

indexOf() був доданий в стандарт ECMA-262 в 5-му виданні; як такий він може бути присутнім не у всіх браузерах. Це можна обійти, використовуючи наступний код на початку скриптів. Це дозволить вам використовувати метод indexOf(), коли ще немає вбудованої підтримки в браузері. Цей алгоритм збігається із зазначеною в ECMA-262, 5-е видання, припускаючи, щоTypeError і Math.abs() має свої оригінальні значення.

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function indexOf(member, startFrom) {
    /*
   У спрощеному режимі, якщо змінна `this` має значення null або
 undefined, то вона встановлюється в об'єкт window. В іншому випадку
 `this` автоматично перетворюється в об'єкт. У строгому режимі, якщо
 змінна 'this' має значення null або undefined, генерується 'TypeError'.
    */
    if (this == null) {
      throw new TypeError("Array.prototype.indexOf() - can't convert `" + this + "` to object");
    }

    var
      index = isFinite(startFrom) ? Math.floor(startFrom) : 0,
      that = this instanceof Object ? this : new Object(this),
      length = isFinite(that.length) ? Math.floor(that.length) : 0;

    if (index >= length) {
      return -1;
    }

    if (index < 0) {
      index = Math.max(length + index, 0);
    }

    if (member === undefined) {
      /*
        Оскільки `member` не визначено, ключі, які не існують,
        будуть мати те ж значення, що і `member`, і, отже, повинні
        бути перевірені.
      */
      do {
        if (index in that && that[index] === undefined) {
          return index;
        }
      } while (++index < length);
    } else {
      do {
        if (that[index] === member) {
          return index;
        }
      } while (++index < length);
    }

    return -1;
  };
}

Однак, якщо ви більше зацікавлені у всіх маленьких технічних бітах, визначених стандартом ECMA, і менше стурбовані продуктивністю або лаконічністю, то ви можете знайти це більш описове заповнення більш корисним.

// Кроки продукції ECMA-262, Edition 5, 15.4.4.14
// Посилання: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Нехай o є результатом виклику ToObject, що передає це
    //    значення в якості аргументу.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Нехай lenValue є результатом виклику Get,
    //    внутрішнього методу o з аргументом "length".
    // 3. Нехай len буде ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. Якщо len рівне 0, return -1.
    if (len === 0) {
      return -1;
    }

    // Якщо аргумент fromIndex був переданий, let n = 
    // ToInteger(fromIndex); інакше let n = 0.
    var n = fromIndex | 0;

    // 6. Якщо n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. Якщо n >= 0, то нехай k дорівнює n.
    // 8. Інакше, n<0, нехай k дорівнює len - abs(n).
    //    Якщо k менше, ніж 0, тоді нехай k дорівнює 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Повторювати, доки k < len
    while (k < len) {
      // а. Нехай Pk дорівнює ToString(k). Це неочевидно для лівосторонніх операндів оператора in
      // б. Нехай kPresent буде результатом виклику
      //    внутрішнього метода o HasProperty з аргументом Pk.
      //    Цей крок можна поєднати з в
      // в. Якщо kPresent дорівнює true, тоді
      //    i.  Нехай elementK буде результатом виклику
      //        внутрішнього метода o Getwith з аргументом ToString(k).
      //   ii.  Нехай те саме буде результатом застосування
      //        Алгоритму Строгого Порівняння (Strict Equality Comparison Algorithm)
      //        до searchElement та elementK.
      //  iii.  Якщо те саме дорівнює true, повернути k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

Специфікації

Специфікація Статус Коментар
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Standard Початкове визначення. Реалізовано у JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Standard
ECMAScript Latest Draft (ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
indexOfChrome Full support YesEdge Full support 12Firefox Full support 1.5IE Full support 9Opera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Примітки щодо сумісності

  • Починаючи з Firefox 47 (Firefox 47 / Thunderbird 47 / SeaMonkey 2.44),  цей метод більше не повертатиме -0. Наприклад, [0].indexOf(0, -0) тепер завжди повертатиме +0 (bug 1242043).

Див. також

Мітки документа й учасники

Зробили внесок у цю сторінку: DariaManko, mdnwebdocs-bot, Halochkin, AlexKutkanych
Востаннє оновлена: DariaManko,