Итерационные методы
Итерационные методы
Итерационные методы — декларативный способ работы с массивами. Каждый принимает коллбек и применяет его к каждому элементу.
forEach — выполнить для каждого
const fruits = ['яблоко', 'банан', 'вишня'];
fruits.forEach((fruit, index, array) => {
console.log(`${index}: ${fruit}`);
});
// 0: яблоко, 1: банан, 2: вишня
Не возвращает значение (undefined). Используйте для побочных эффектов (вывод, запись в DOM).
map — трансформировать каждый элемент
const nums = [1, 2, 3, 4, 5];
const doubled = nums.map(n => n * 2);
// [2, 4, 6, 8, 10]
const strings = nums.map(n => `Число ${n}`);
// ['Число 1', 'Число 2', ...]
// map с объектами
const users = [{ id: 1, name: 'Иван' }, { id: 2, name: 'Мария' }];
const names = users.map(user => user.name); // ['Иван', 'Мария']
const withStatus = users.map(user => ({ ...user, active: true }));
filter — отфильтровать элементы
const nums = [1, 2, 3, 4, 5, 6, 7, 8];
const evens = nums.filter(n => n % 2 === 0);
// [2, 4, 6, 8]
const bigNums = nums.filter(n => n > 5);
// [6, 7, 8]
// filter с объектами
const activeUsers = users.filter(user => user.isActive);
const admins = users.filter(user => user.role === 'admin');
reduce — свернуть в одно значение
const nums = [1, 2, 3, 4, 5];
// Сумма
const sum = nums.reduce((acc, n) => acc + n, 0); // 15
// Произведение
const product = nums.reduce((acc, n) => acc * n, 1); // 120
// Максимальное значение
const max = nums.reduce((acc, n) => Math.max(acc, n), -Infinity); // 5
// Из массива в объект
const users = [{ id: 1, name: 'Иван' }, { id: 2, name: 'Мария' }];
const byId = users.reduce((map, user) => {
map[user.id] = user;
return map;
}, {});
// { 1: {id:1, name:'Иван'}, 2: {id:2, name:'Мария'} }
Начальное значение (второй аргумент reduce) — обязательно при работе с объектами или пустыми массивами.
find и findIndex — найти первый подходящий
const users = [
{ id: 1, name: 'Иван', age: 25 },
{ id: 2, name: 'Мария', age: 30 },
{ id: 3, name: 'Пётр', age: 25 }
];
// find — возвращает первый совпадающий элемент
const ivan = users.find(u => u.name === 'Иван');
// { id: 1, name: 'Иван', age: 25 }
const notFound = users.find(u => u.name === 'Николай');
// undefined
// findIndex — возвращает индекс
const mariaIdx = users.findIndex(u => u.name === 'Мария');
// 1
some и every — проверить условие
const nums = [1, 2, 3, 4, 5];
// some — хотя бы один соответствует
nums.some(n => n > 4); // true — 5 > 4
nums.some(n => n > 10); // false
// every — все соответствуют
nums.every(n => n > 0); // true
nums.every(n => n % 2 === 0); // false
Теоретически reduce может заменить map, filter, find и другие методы:
// map через reduce
const doubled = nums.reduce((acc, n) => [...acc, n * 2], []);
// filter через reduce
const evens = nums.reduce((acc, n) => n % 2 === 0 ? [...acc, n] : acc, []);
Но это не значит, что нужно так делать. map и filter более читаемы. reduce используйте когда нужно нестандартное свёртывание — в объект, подсчёт, группировка.