Перейти к основному содержимому

Помощники итераторов

· 5 мин. чтения
Резван Махдави Хезавех

Помощники итераторов — это набор новых методов в прототипе итератора, которые облегчают общее использование итераторов. Так как эти вспомогательные методы находятся в прототипе итератора, любой объект, имеющий Iterator.prototype в своей цепочке прототипов (например, итераторы массивов), получит эти методы. В следующих подразделах мы объясним помощников итераторов. Все приведенные примеры работают на странице архива блога, содержащей список публикаций, иллюстрируя, насколько полезны помощники итераторов для поиска и манипуляции публикациями. Вы можете попробовать их на странице блога V8!

.map(mapperFn)

map принимает функцию отображения в качестве аргумента. Этот вспомогательный метод возвращает итератор значений с применением функции отображения к исходным значениям итератора.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Получите список публикаций, верните их текст (заголовки) и выведите их.
for (const post of posts.values().map((x) => x.textContent)) {
console.log(post);
}

.filter(filtererFn)

filter принимает функцию фильтра в качестве аргумента. Этот вспомогательный метод возвращает итератор значений из исходного итератора, для которых функция фильтра вернула истинное значение.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Отфильтруйте публикации блога, которые содержат `V8` в текстовом содержимом (заголовках), и выведите их.
for (const post of posts.values().filter((x) => x.textContent.includes('V8'))) {
console.log(post);
}

.take(limit)

take принимает целое число в качестве аргумента. Этот вспомогательный метод возвращает итератор значений из исходного итератора, до limit значений.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Выберите 10 последних публикаций и выведите их.
for (const post of posts.values().take(10)) {
console.log(post);
}

.drop(limit)

drop принимает целое число в качестве аргумента. Этот вспомогательный метод возвращает итератор значений из исходного итератора, начиная с значения после limit значений.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Пропустите 10 последних публикаций и выведите остальные.
for (const post of posts.values().drop(10)) {
console.log(post);
}

.flatMap(mapperFn)

flatMap принимает функцию отображения в качестве аргумента. Этот вспомогательный метод возвращает итератор значений итераторов, созданных применением функции отображения к исходным значениям итератора. То есть, итераторы, возвращаемые функцией отображения, уплощаются в итератор, возвращаемый этим вспомогательным методом.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Получите список тегов публикаций и выведите их. Каждая публикация может иметь более
// одного тега.
for (const tag of posts.values().flatMap((x) => x.querySelectorAll('.tag').values())) {
console.log(tag.textContent);
}

.reduce(reducer [, initialValue ])

reduce принимает функцию редукции и необязательное начальное значение. Этот вспомогательный метод возвращает одно значение как результат применения функции редукции к каждому значению итератора с учетом последнего результата применения функции редукции. Начальное значение используется как начальная точка для функции редукции при обработке первого значения итератора.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Получите список тегов для всех публикаций.
const tagLists = posts.values().flatMap((x) => x.querySelectorAll('.tag').values());

// Получите текстовое содержимое для каждого тега из списка.
const tags = tagLists.map((x) => x.textContent);

// Подсчитайте публикации с тегом 'security'.
const count = tags.reduce((sum , value) => sum + (value === 'security' ? 1 : 0), 0);
console.log(count);

.toArray()

toArray возвращает массив из значений итератора.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Создайте массив из списка 10 последних публикаций.
const arr = posts.values().take(10).toArray();

.forEach(fn)

forEach принимает функцию в качестве аргумента и применяется к каждому элементу итератора. Этот вспомогательный метод вызывается для своего побочного эффекта и возвращает undefined.

// Выберите список публикаций из страницы архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Получите даты, когда хотя бы одна запись в блоге опубликована, и выведите их.
const dates = new Set();
const forEach = posts.values().forEach((x) => dates.add(x.querySelector('time')));
console.log(dates);

.some(fn)

some принимает предикат в качестве аргумента. Этот метод возвращает true, если любой элемент итератора возвращает true при применении функции. Итератор потребляется после вызова some.

// Выберите список записей блога на странице архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Узнайте, содержит ли текстовое содержимое (заголовок) любой записи блога ключевое слово `Iterators`.
// ключевое слово.
posts.values().some((x) => x.textContent.includes('Iterators'));

.every(fn)

every принимает предикат в качестве аргумента. Этот метод возвращает true, если каждый элемент итератора возвращает true при применении функции. Итератор потребляется после вызова every.

// Выберите список записей блога на странице архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Узнайте, содержит ли текстовое содержимое (заголовок) всех записей блога ключевое слово `V8`.
posts.values().every((x) => x.textContent.includes('V8'));

.find(fn)

find принимает предикат в качестве аргумента. Этот метод возвращает первое значение итератора, для которого функция возвращает истинное значение, или undefined, если ни одно значение итератора не соответствует.

// Выберите список записей блога на странице архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Выведите текстовое содержимое (заголовок) последней записи блога, содержащей ключевое слово `V8`.
console.log(posts.values().find((x) => x.textContent.includes('V8')).textContent);

Iterator.from(object)

from — это статический метод, принимающий объект в качестве аргумента. Если object уже является экземпляром Iterator, метод возвращает его напрямую. Если у object есть Symbol.iterator, что означает, что он является итерируемым, вызывается его метод Symbol.iterator, чтобы получить итератор, и метод возвращает его. В противном случае создается новый объект Iterator (наследующий от Iterator.prototype и имеющий методы next() и return()), который обертывает object, и он возвращается этим методом.

// Выберите список записей блога на странице архива блога.
const posts = document.querySelectorAll('li:not(header li)');

// Сначала создайте итератор из списка записей. Затем выведите текстовое содержимое (заголовок)
// последней записи блога, содержащей ключевое слово `V8`.
console.log(Iterator.from(posts).find((x) => x.textContent.includes('V8')).textContent);

Доступность

Помощники итераторов доступны в V8 v12.2.

Поддержка помощников итераторов