--- title: Array.prototype.indexOf() slug: Web/JavaScript/Reference/Global_Objects/Array/indexOf tags: - Array - JavaScript - Масив - метод translation_of: Web/JavaScript/Reference/Global_Objects/Array/indexOf ---
Метод indexOf()
повертає перший індекс, за яким даний елемент був знайдений в масиві, а якщо він відсутній, то повертає -1.
Примітка: Щодо метода String, дивіться {{jsxref("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_inline}}Примітка:
якщо наданий індекс від'ємний, масив все ще ітерується спереду назад. Якщо індекс рівний 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-е видання, припускаючи, що{{jsxref("Global_Objects/TypeError", "TypeError")}} і {{jsxref("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; }; }
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ES5.1', '#sec-15.4.4.14', 'Array.prototype.indexOf')}} | {{Spec2('ES5.1')}} | Початкове визначення. Реалізовано у JavaScript 1.6. |
{{SpecName('ES6', '#sec-array.prototype.indexof', 'Array.prototype.indexOf')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-array.prototype.indexof', 'Array.prototype.indexOf')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Array.indexOf")}}
-0
. Наприклад, [0].indexOf(0, -0)
тепер завжди повертатиме +0
({{bug(1242043)}}).