JavaScript迭代器是在ES6中引入的,它们用于循环遍历一系列值,通常是某种集合。根据定义,迭代器必须实现next()函数,该函数以{value,done}的形式返回一个对象,其中value是迭代序列中的下一个值,done是一个布尔值,确定序列是否已经被消耗。
一个非常简单的迭代器,在现实世界的项目中具有实际用途,可以如下所示:
下面代码实现的是让对象数组按照next字段的顺序去遍历
class LinkedList {
constructor(data) {
this.data = data;
}
firstItem() {
return this.data.find(i => i.head);
}
findById(id) {
return this.data.find(i => i.id === id);
// find方法返回找到满足条件的第一个
}
[Symbol.iterator]() {
// 迭代器 固定写法
// [Symbol.iterator] 返回一个对象的无参函数,被返回对象符合迭代器协议
let item = {next: this.firstItem().id};
return {
next: () => {
item = this.findById(item.next);
if(item) {
return {value: item.value, done: false};
}
return {value: undefined, done: true};
}
// next 返回一个对象,
// 对象包含 done 和 value 属性。
// 其中 done 表示遍历是否结束,value 返回当前遍历的值。
};
}
}
const myList = new LinkedList([
{id: 'a10', value: 'First', next: 'a13', head: true },
{id: 'a11', value: 'Last', next: null, head: false },
{id: 'a12', value: 'Third', next: 'a11', head: false },
{id: 'a13', value: 'Second', next: 'a12', head: false }
]);
for(let item of myList) {
console.log(item); // 'First', 'Second', 'Third', 'Last'
}
与此相关的是,迭代器只是函数,这意味着它们可以像任何其他函数一样被调用(例如,将迭代委托给现有的迭代器),同时也不限于Symbol. iterator名称,允许我们为同一对象定义多个迭代器。以下是这些概念的一个例子:
class SpecialList {
constructor(data) {
this.data = data;
}
[Symbol.iterator]() {
return this.data[Symbol.iterator]();
}
values() {
return this.data
.filter(i => i.complete)
.map(i => i.value)
[Symbol.iterator]();
}
}
const myList = new SpecialList([
{complete: true, value: 'Lorem ipsum'},
{complete: true, value: 'dolor sit amet'},
{complete: false},
{complete: true, value: 'adipiscing elit'}
]);
for(let item of myList) {
console.log(item); // The exact data passed to the SpecialList constructor above
}
for(let item of myList.values()) {
console.log(item); // 'Lorem ipsum', 'dolor sit amet', 'adipiscing elit'
}
在本例中,我们使用数据对象的本机数组迭代器使我们的SpecialList 可迭代,返回数据数组的确切值。同时,我们还定义了一个值方法,它本身是一个迭代器,在数据数组上使用Array.prototype.filter()和Array.prototype.map(),然后最后返回结果的Symbol. iterator,只允许迭代序列中的非空对象,并只返回每个对象的值。
https://www.30secondsofcode.org/blog/s/javascript-iterators