--- 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])
searchElementfromIndex {{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)}}).