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).