Array.prototype.some()
Метод some()
(якийсь) примірників Array
перевіряє, чи проходить хоча б один елемент масиву тест, реалізований у переданій функції. Цей метод повертає істинність, якщо знаходить в масиві елемент, для якого надана функція повертає істинність, інакше – хибність. Він не змінює масив.
Спробуйте його в дії
Синтаксис
some(callbackFn)
some(callbackFn, thisArg)
Параметри
callbackFn
(функція зворотного виклику)Функція для виконання на кожному елементі масиву. Повинна повертати істинне значення, коли елемент проходить перевірку, а інакше – хибне. Ця функція викликається з наступними аргументами:
element
(елемент)Поточний елемент масиву, що обробляється.
index
(індекс)Індекс поточного елементу масиву, що обробляється.
array
(масив)Масив, на котрому викликали
some()
.
thisArg
(аргументthis
) Необов'язковеЗначення, котре використовуватиметься як
this
при виконанніcallbackFn
. Докладніше – в ітеративних методах.
Повернене значення
false
, якщо callbackFn
не поверне істинне значення для одного з елементів масиву, – в цьому випадку негайно повертається true
.
Опис
Метод some()
є ітеративним методом. Він викликає надану функцію callbackFn
один раз для кожного елемента масиву, поки callbackFn
не поверне значення істинності. Якщо такий елемент знайдено, то some()
негайно повертає true
і припиняє ітерування масиву. Інакше, якщо callbackFn
повертає значення хибності для всіх елементів, то some()
повертає false
. Більше про те, як загалом працюють такі методи, читайте в розділі ітеративних методів.
some()
діє подібно до квантора існування в математиці. Наприклад, для порожнього масиву він повертає false
для будь-якої умови.
callbackFn
закликається лише для тих індексів масиву, що мають відповідні їм значення. Вона не закликається для порожніх комірок у розріджених масивах.
some()
не видозмінює масив, на котрому викликаний, але функція, передана як callbackFn
, може це робити. Проте зверніть увагу на те, що довжина масиву зберігається до першого заклику callbackFn
. Таким чином:
callbackFn
не оброблятиме жодних елементів, доданих поза початковою довжиною масиву, актуальною на мить початку викликуsome()
.- Зміни до вже оброблених індексів не призводять до повторного виклику на них
callbackFn
. - Якщо наявний, поки необроблений елемент масиву змінюється
callbackFn
, то його значення, передане вcallbackFn
, буде значенням на ту мить, коли цей елемент обробляється. Видалені елементи – не обробляються.
[!WARNING] Паралельні зміни, подібні до описаних вище, часто призводять до складно зрозумілого коду і, як правило, їх слід уникати (за винятком спеціальних випадків).
Метод some()
є узагальненим. Він лишень очікує, що значення this
матиме властивість length
, а також властивості з цілочисловими ключами.
Приклади
Перевірка значення елементів масиву
Наступний приклад перевіряє, чи є який-небудь елемент масиву більшим за 10.
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
Перевірка елементів масиву за допомогою стрілкових функцій
Стрілкові функції надають коротший синтаксис для такої ж перевірки.
[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true
Перевірка існування значення в масиві
Щоб імітувати функцію метода includes()
, ця власна функція повертає true
, якщо елемент існує в масиві:
const fruits = ["яблуко", "банан", "манго", "гуава"];
function checkAvailability(arr, val) {
return arr.some((arrVal) => val === arrVal);
}
checkAvailability(fruits, "грейпфрут"); // false
checkAvailability(fruits, "банан"); // true
Перетворення будь-якого значення на булеве
const TRUTHY_VALUES = [true, "true", 1];
function getBoolean(value) {
if (typeof value === "string") {
value = value.toLowerCase().trim();
}
return TRUTHY_VALUES.some((t) => t === value);
}
getBoolean(false); // false
getBoolean("false"); // false
getBoolean(1); // true
getBoolean("true"); // true
Використання третього аргументу callbackFn
Аргумент array
корисний тоді, коли є потреба звернутися до іншого елемента масиву, особливо коли немає змінної, що посилається на цей масив. У наступному прикладі спочатку застосовується filter()
для видобування додатних значень, а потім – some()
для перевірки, чи відсортований масив у порядку зростання.
const numbers = [3, -1, 1, 4, 1, 5];
const isIncreasing = !numbers
.filter((num) => num > 0)
.some((num, idx, arr) => {
// Без аргументу arr немає способу легко отримати доступ до
// проміжного масиву без збереження його в змінній.
if (idx === 0) return false;
return num <= arr[idx - 1];
});
console.log(isIncreasing); // false
Використання some() на розріджених масивах
some()
не запускатиме свій предикат на порожніх комірках.
console.log([1, , 3].some((x) => x === undefined)); // false
console.log([1, , 1].some((x) => x !== 1)); // false
console.log([1, undefined, 1].some((x) => x !== 1)); // true
Виклик some() на об'єктах-немасивах
Метод some()
зчитує з this
властивість length
, а потім звертається до кожної властивості, чий ключ є невід'ємним цілим числом, меншим за length
, поки не будуть перебрані вони всі або callbackFn
не поверне true
.
const arrayLike = {
length: 3,
0: "a",
1: "b",
2: "c",
3: 3, // ігнорується some(), оскільки length – 3
};
console.log(Array.prototype.some.call(arrayLike, (x) => typeof x === "number")); // false
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
some
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1.5 | Internet Explorer Full support 9 | Opera Full support 9.5 | Safari Full support 3 | WebView Android Full support 37 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |