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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
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

Дивіться також