Array.prototype.indexOf()

Метод 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 (ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Living Standard

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

BCD tables only load in the browser

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

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

Див. також