Iterator helpers 是迭代器原型上的一组新方法,有助于一般的迭代器使用。由于这些辅助方法在迭代器原型上,任何在其原型链上具有 Iterator.prototype
的对象(例如数组迭代器)都会获得这些方法。在以下各小节中,我们将解释 Iterator helpers。提供的所有示例都在博客存档页面上运行,其中包括博客文章列表,演示了 Iterator helpers 如何帮助查找和操作文章。您可以在 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
接受一个 reducer 函数和一个可选的初始值作为参数。这个辅助方法返回应用 reducer 函数于迭代器的每个值时保持 reducer 的最后结果的一个值。当处理迭代器的第一个值时,初始值被用作 reducer 函数的起始点。
// 从博客存档页面中选择博客文章列表。
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
已经是一个迭代器实例,则辅助方法直接返回它。如果 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);
可用性
Iterator helpers 已在 V8 v12.2 中发布。