Допоміжні методи ітераторів (ES2025) - map, filter, take, drop, flatMap, reduce, some, every, find, forEach, toArray - тепер є не лише в масивах, а й у будь-якому ітераторі.
Різниця з методами масиву - лінивість. Ланцюжок методів масиву на кожному кроці створює новий масив цілком:
const result = hugeArray
.filter((n) => n % 2) // новий масив на сотні тисяч елементів
.map((n) => n * 10) // ще один
.slice(0, 2); // а потрібно було лише 2 елементи
Методи ітератора нічого не обчислюють наперед. Кожен елемент проходить увесь ланцюжок по одному, і лише коли його запитали:
const result = hugeArray
.values() // ітератор масиву
.filter((n) => n % 2)
.map((n) => n * 10)
.take(2) // зупиниться після двох
.toArray();
Оброблено рівно стільки елементів, скільки потрібно, щоб знайти два, - без проміжних масивів.
Нескінченні послідовності стають природними:
function* naturals() {
let n = 1;
while (true) yield n++;
}
naturals().filter((n) => n % 7 === 0).take(3).toArray(); // [7, 14, 21]
З масивом таке неможливо в принципі.
Ітератори всюди:
map.keys().filter((key) => key.startsWith('user:')).toArray();
set.values().map((tag) => tag.toLowerCase());
document.querySelectorAll('li').values().filter((li) => li.dataset.active).toArray();
Iterator.from(obj) перетворює будь-який ітерований об'єкт (чи об'єкт з методом next) на ітератор з цими методами.
Що варто знати:
- ітератор одноразовий: після проходу він вичерпаний. Повторний
toArray()поверне порожній масив. Масив можна перебирати скільки завгодно; - немає довжини й доступу за індексом - якщо потрібні
length,sort,at, перетворюйте на масив; - на невеликих масивах виграшу немає, а ланцюжок методів масиву звичніший;
- асинхронних версій (для асинхронних ітераторів) поки немає в стандарті - це окрема пропозиція.
Коли використовувати: великі чи потенційно нескінченні послідовності, ранній вихід (take, find), обробка Map/Set без проміжних масивів, генератори даних.
Підтримка: Chrome 122+, Firefox 131+, Safari 18.4+, Node.js 22+.
Аналогія з Laravel: LazyCollection проти Collection - те саме розрізнення між лінивою й «жадібною» обробкою, і cursor()/lazy() для великих вибірок з бази.