Array callback methods в JavaScript
- Что такое array callback methods
- Общий синтаксис
- Параметры callback-функции
- forEach()
- map()
- filter()
- find()
- some() и every()
- reduce()
- return в callback
- Итого
Array callback methods - это методы массивов, которые принимают функцию и вызывают ее для элементов массива.
let numbers = [1, 2, 3];
numbers.forEach(function (number) {
console.log(number);
});
Функция внутри forEach() - это callback. Метод сам вызывает ее для каждого элемента массива.
Что такое array callback methods
Некоторые методы массивов не просто выполняют действие сами, а дают нам возможность описать это действие через callback-функцию.
Например, что сделать с каждым элементом, какой элемент оставить, какой элемент найти или как собрать итоговое значение.
К таким методам относятся:
forEach()- перебрать элементы;map()- создать новый массив;filter()- отфильтровать элементы;find()- найти первый подходящий элемент;some()- проверить, есть ли хотя бы один подходящий элемент;every()- проверить, подходят ли все элементы;reduce()- собрать одно значение из массива.
Общий синтаксис
У большинства таких методов похожий принцип записи.
array.method(function (element, index, array) {
// действие с элементом
});
Вместо обычной функции часто используют стрелочную.
array.method((element, index, array) => {
// действие с элементом
});
Названия параметров можно менять. Главное - их порядок.
Параметры callback-функции
Callback-функция в методах массива обычно может получать три значения:
let users = ['Анна', 'Игорь', 'Мария'];
users.forEach(function (user, index, array) {
console.log(user);
console.log(index);
console.log(array);
});
user - текущий элемент массива.
index - индекс текущего элемента.
array - сам массив, по которому идет перебор.
Чаще всего нужен только первый параметр.
users.forEach((user) => {
console.log(user);
});
forEach()
forEach() выполняет callback для каждого элемента массива.
let fruits = ['яблоко', 'банан', 'груша'];
fruits.forEach((fruit) => {
console.log(fruit);
});
Этот метод удобен, когда нужно что-то сделать с каждым элементом: вывести в консоль, создать разметку, вызвать функцию.
forEach() не создает новый массив.
map()
map() создает новый массив на основе старого.
let prices = [100, 200, 300];
let pricesWithTax = prices.map((price) => {
return price * 1.2;
});
console.log(pricesWithTax);
Результат:
[120, 240, 360]
Количество элементов в новом массиве будет таким же, как в исходном.
filter()
filter() создает новый массив только из тех элементов, для которых callback вернул true.
let ages = [14, 22, 17, 30];
let adults = ages.filter((age) => {
return age >= 18;
});
console.log(adults);
Результат:
[22, 30]
find()
find() возвращает первый элемент, который подходит под условие.
let users = [
{ name: 'Анна', role: 'user' },
{ name: 'Игорь', role: 'admin' },
{ name: 'Мария', role: 'user' }
];
let admin = users.find((user) => {
return user.role === 'admin';
});
console.log(admin);
Результат:
{ name: 'Игорь', role: 'admin' }
Если подходящего элемента нет, find() вернет undefined.
some() и every()
some() проверяет, есть ли в массиве хотя бы один подходящий элемент.
let ages = [14, 16, 21];
let hasAdult = ages.some((age) => {
return age >= 18;
});
console.log(hasAdult);
Результат:
true
every() проверяет, подходят ли все элементы массива.
let scores = [80, 90, 75];
let allPassed = scores.every((score) => {
return score >= 60;
});
console.log(allPassed);
Результат:
true
reduce()
reduce() помогает получить одно итоговое значение из массива.
let numbers = [10, 20, 30];
let sum = numbers.reduce((result, number) => {
return result + number;
}, 0);
console.log(sum);
Результат:
60
result - накопленное значение. number - текущий элемент массива.
return в callback
Для разных методов значение return используется по-разному.
В map() то, что вернул callback, попадет в новый массив.
let numbers = [1, 2, 3];
let doubled = numbers.map((number) => {
return number * 2;
});
В filter(), find(), some() и every() callback должен вернуть условие.
let adults = ages.filter((age) => {
return age >= 18;
});
А у forEach() результат callback-функции не используется.
let result = numbers.forEach((number) => {
return number * 2;
});
console.log(result);
Результат:
undefined
Если нужен новый массив, используйте map(), а не forEach().
Итого
1. Array callback methods принимают функцию и вызывают ее для элементов массива.
2. Callback обычно получает элемент, индекс и сам массив.
3. forEach() нужен для перебора, map() - для создания нового массива, filter() - для отбора элементов.
4. find() возвращает первый подходящий элемент, some() и every() возвращают true или false.
5. reduce() собирает одно итоговое значение из массива.