Помощники итераторов
Помощники итераторов — это набор новых методов в прототипе итератора, которые облегчают общее использование итераторов. Так как эти вспомогательные методы находятся в прототипе итератора, любой объект, имеющий 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.