碎片时间学编程「02」 JavaScript 迭代器,我在哪里可以使用?

JavaScript 迭代器是在 ES6 中引入的,它们用于循环一系列值,通常是某种集合。根据定义,迭代器必须实现一个函数,该函数以where是迭代序列中的下一个值next()的形式返回一个对象,并且是一个确定序列是否已被消耗的布尔值。{ value, done } valuedone

在实际项目中具有实际用途的非常简单的迭代器可能如下所示:

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);

}

[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 };

},

};

}

}

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'

}

在上面的例子中,我们实现了一个内部使用数组的LinkedList数据结构。其中的每个项目的data 都有一个value和一些特定于实现的属性,用于确定其在序列中的位置。默认情况下,从此类构造的对象不可迭代。为了定义一个迭代器,我们使用Symbol.iterator并设置它,以便返回的序列基于类的内部实现是有序的,而返回的项目只返回它们的value.

在相关的说明中,迭代器只是函数,这意味着它们可以像任何其他函数一样被调用(例如,将迭代委托给现有的迭代器),同时也不受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'

}

在此示例中,我们使用data对象的本机数组迭代器来使我们的SpecialList可迭代,返回数组的确切值data。同时,我们还定义了一个values方法,它本身就是一个迭代器,在数组上使用Array.prototype.filter()。最后,我们返回结果,只允许对序列中的非空对象进行迭代,并且只返回每个对象的 。Array.prototype.map()dataSymbol.iterator 值。

你可能感兴趣的:(碎片时间学编程「02」 JavaScript 迭代器,我在哪里可以使用?)