Массивы и их методы
↑ 1.4 JavaScript: основы · ← Предыдущая · → Следующая
Зачем это на собесе
Ежедневный инструмент; на интервью просят реализовать
map/filter/reduceи знать, какие методы мутируют.
Объяснение
| Категория | Методы |
|---|---|
| Преобразование (новый массив) | map, filter, slice, concat, flat, flatMap, toSorted, toReversed, toSpliced, with |
| Свёртка | reduce, reduceRight |
| Поиск | find, findIndex, findLast, indexOf, includes, some, every |
| Мутирующие | push, pop, shift, unshift, splice, sort, reverse, fill |
| Прочее | Array.from, Array.of, Array.isArray, at, join, entries/keys/values |
const orders = [{ id: 1, total: 100, paid: true }, { id: 2, total: 50, paid: false }];
orders.filter(o => o.paid).map(o => o.total); // [100]
orders.reduce((sum, o) => sum + o.total, 0); // 150
Object.groupBy(orders, o => o.paid ? "paid" : "open"); // { paid: [...], open: [...] }
[...new Set([1, 2, 2, 3])]; // уникальные
[3, 1, 10].sort(); // [1, 10, 3] — по умолчанию строки!
[3, 1, 10].sort((a, b) => a - b); // [1, 3, 10]
const copy = [...arr].sort(); // не мутируя (или toSorted)
Array.from({ length: 5 }, (_, i) => i * 2); // [0,2,4,6,8]Сложность: push/pop O(1), shift/unshift O(n), includes/indexOf O(n), sort O(n log n).
Итерация: for...of, forEach (нельзя прервать; break невозможен), for (быстрее и с await), some/every для прерывания.
Нюансы и подводные камни
sortбез компаратора сортирует как строки и мутирует массив.mapсasyncвозвращает массив промисов:await Promise.all(arr.map(...)).forEachне ждётawaitвнутри.arr.length = 0очищает массив;delete arr[i]создаёт «дыру».reduceбез начального значения на пустом массиве бросает ошибку.- Изменение массива во время перебора приводит к пропускам.
Практика
- Реализуйте свои
map,filter,reduce,flat. - Сгруппируйте заказы по клиенту и посчитайте суммы через
reduce. - Уберите дубликаты по ключу объекта.
Вопросы с ответами
Какие методы массива мутируют его?
push,pop,shift,unshift,splice,sort,reverse,fill; у новых версий есть неизменяющие аналогиtoSortedи др.
Чем
mapотличается отforEach?
mapвозвращает новый массив результатов,forEach— ничего.
Почему
[10, 9, 1].sort()даёт[1, 10, 9]?Сортировка по умолчанию сравнивает элементы как строки.