> 提供一种方法,可以顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示,就叫做迭代器模式。
> 绝大部分程序语言都内置了迭代器,比如 ES5 的 forEach
等,ES6 更是为 Array、Map、Set以及类数组对象提供了统一的迭代器接口,使用 for...of
循环便会默认调用该接口。
> 由于绝大部分程序语言都内置了迭代器,所以我们没有必要去自己写一个,除非我们想要手动控制迭代的过程或顺序,用来满足更加多变的需求。
> 比如我们想要创建一个迭代器,能够访问数据集合的第一个、最后一个、前一个、后一个、当前这个、某一个以及倒序的功能。
例子:
const Iterator = (list) => { // 当前索引值,默认为第一个 let current = 0; // 第一个 const first = () => { return list[0]; }; // 最后一个 const last = () => { return list[list.length - 1]; }; // 前一个 const pre = () => { current -= 1; // 如果当前是第一个,则返回 undefined if (current < 0) { current = 0; return; } // 否则返回前一个 return list[current]; }; // 后一个 const next = () => { current += 1; // 如果当前是最后一个,则返回 undefined if (current === list.length) { current = list.length - 1; return; } // 否则返回后一个 return list[current]; }; // 当前这个 const cur = () => { return list[current]; }; // 某一个 const nth = (index) => { // 如果索引值在数组长度范围内,则返回相应值 if (index >= 0 && index < list.length) { return list[index]; } // 否则返回 undefined return; }; // 倒序 const reverse = () => { const _arr = []; for (let i = list.length - 1; i >= 0; i--) { _arr.push(list[i]); } return _arr; }; return { first, last, pre, next, cur, nth, reverse, }; }; // 测试代码 const arr = ['a', 'b', 'c', 'd']; const iterator = Iterator(arr); console.log(iterator.first()); // a console.log(iterator.last()); // d console.log(iterator.next()); // b console.log(iterator.next()); // c console.log(iterator.pre()); // b console.log(iterator.cur()); // b console.log(iterator.nth(3)); // d console.log(iterator.reverse()); // ["d", "c", "b", "a"]
如有错误,欢迎指正,本人不胜感激。