Elementor Header #8

47. Предикаты

Предикаты — это функции, которые возвращают логическое значение (true или false). Они играют важную роль в программировании, так как позволяют проверять условия и выполнять действия в зависимости от результата этих проверок. В JavaScript предикаты часто используются в конструкциях if, циклах, фильтрации массивов и других ситуациях, где требуется проверить, соответствует ли что-то определённому критерию.

Основы предикатов

Предикат — это функция, которая принимает один или несколько аргументов и возвращает либо true, либо false в зависимости от логического выражения внутри неё.

Пример простого предиката:

				
					function isEven(number) {
    return number % 2 === 0;
}

console.log(isEven(4)); // true
console.log(isEven(7)); // false

				
			

В этом примере функция isEven проверяет, является ли переданное число чётным, и возвращает true, если это так, и false в противном случае.

Использование предикатов

Предикаты можно использовать в различных ситуациях, например, для фильтрации массивов:

				
					let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let evenNumbers = numbers.filter(isEven);

console.log(evenNumbers); // [2, 4, 6, 8, 10]

				
			

Здесь предикат isEven используется для фильтрации массива, чтобы получить только чётные числа.

Также предикаты часто используются в условиях:

				
					let age = 20;

function isAdult(age) {
    return age >= 18;
}

if (isAdult(age)) {
    console.log("Вы совершеннолетний.");
} else {
    console.log("Вы несовершеннолетний.");
}

				
			

Сложные предикаты

Предикаты могут быть сложными, объединяя несколько условий с использованием логических операторов.

Пример сложного предиката:

				
					function isEligibleToVote(age, isCitizen) {
    return age >= 18 && isCitizen;
}

console.log(isEligibleToVote(20, true));  // true
console.log(isEligibleToVote(16, true));  // false
console.log(isEligibleToVote(20, false)); // false

				
			

Здесь предикат isEligibleToVote проверяет два условия: возраст и гражданство. Пользователь может голосовать, только если оба условия выполнены.

Использование предикатов в функциях высшего порядка

Предикаты широко используются в функциях высшего порядка, таких как filter, some, every и других. Например:

				
					let numbers = [1, 2, 3, 4, 5, 6];

let hasOddNumbers = numbers.some(number => number % 2 !== 0);

console.log(hasOddNumbers); // true

				
			

Здесь функция some проверяет, есть ли в массиве хотя бы одно нечётное число, используя предикат в виде анонимной функции.

Распространённые ошибки

  1. Неучёт типов данных: Предикаты могут работать некорректно, если не учитывать типы данных. Например, строка "5" и число 5 могут привести к разным результатам при проверке.

    Пример ошибки:

				
					function isPositiveNumber(value) {
    return value > 0;
}

console.log(isPositiveNumber("5")); // true, но это не число!

				
			

Использование предикатов с функциями высшего порядка без учёта контекста: Иногда забывают, что предикаты в функциях, таких как filter, some и других, применяются к каждому элементу массива. Это может привести к неожиданным результатам, если предикат написан неправильно.

Пример ошибки:

				
					let numbers = [1, 2, 3, 4, 5];

let result = numbers.filter(number => number > 2 && number < 4);
console.log(result); // [3]

				
			

Возвращение не булевых значений: Предикаты должны возвращать только true или false. Возвращение других значений может привести к путанице и неправильной работе программы.

Пример ошибки:

				
					function isValidAge(age) {
    if (age >= 18) {
        return "Valid";
    } else {
        return "Invalid";
    }
}

console.log(isValidAge(20)); // "Valid", но это не boolean!

				
			

Заключение

Тестовое задание

  • Напишите предикат isPositive, который будет проверять, является ли число положительным.
  • Создайте массив чисел и с помощью функции filter отфильтруйте только положительные числа, используя предикат isPositive.
  • Напишите предикат isStringEmpty, который будет проверять, является ли строка пустой.
  • Напишите предикат, который проверяет, начинается ли строка с определённого символа (например, с буквы «A»).
  • С использованием предиката и функции some проверьте, содержит ли массив строк хотя бы одну строку, начинающуюся с буквы «A».
  • Напишите предикат isPalindrome, который проверяет, является ли строка палиндромом (строкой, которая читается одинаково в обе стороны, например, «радар»). Пример использования:
				
					function isPalindrome(str) {
    let reversed = str.split('').reverse().join('');
    return str === reversed;
}

console.log(isPalindrome("радар")); // true
console.log(isPalindrome("тест")); // false

				
			
  • Создайте функцию isBetween, которая принимает три аргумента: value, min, max. Функция должна возвращать true, если value находится в диапазоне между min и max (включительно), и false в противном случае.
				
					function isBetween(value, min, max) {
    return value >= min && value <= max;
}

console.log(isBetween(10, 5, 15)); // true
console.log(isBetween(20, 5, 15)); // false

				
			
  • Напишите предикат hasProperty, который проверяет, есть ли у объекта определённое свойство. Например:
				
					function hasProperty(obj, prop) {
    return obj.hasOwnProperty(prop);
}

let user = { name: "John", age: 30 };

console.log(hasProperty(user, "name")); // true
console.log(hasProperty(user, "address")); // false

				
			
  • Сочетание предикатов: Напишите предикат isAdultAndCitizen, который принимает два аргумента: возраст и статус гражданства. Функция должна возвращать true, если человек взрослый (18 лет и старше) и является гражданином.
				
					function isAdultAndCitizen(age, isCitizen) {
    return age >= 18 && isCitizen;
}

console.log(isAdultAndCitizen(20, true));  // true
console.log(isAdultAndCitizen(16, true));  // false
console.log(isAdultAndCitizen(20, false)); // false

				
			
  • Напишите функцию filterByPredicate, которая принимает массив и предикат в качестве аргументов. Функция должна возвращать новый массив, содержащий только те элементы, которые удовлетворяют предикату.

    Пример:

				
					function filterByPredicate(array, predicate) {
    return array.filter(predicate);
}

let numbers = [1, 2, 3, 4, 5, 6];

let evenNumbers = filterByPredicate(numbers, isEven);

console.log(evenNumbers); // [2, 4, 6]

				
			

Эти задания помогут вам глубже понять, как работать с предикатами в JavaScript, а также научиться комбинировать их для решения более сложных задач.

logo