The iterator pattern refers to providing a method to sequentially access each element in an aggregate object without exposing the internal representation of the object.
1. Iterators in jQuery
$.each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n ); });
2. Implement your own iteration
var each = function(ary, callback) { for(var i = 0, l = ary.length; i < l; i++) { callback.call(ary[i], i, ary[i]); } }; each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n ); });
[1, 2, 3].forEach(function(n, i, curAry){ console.log("当前下标为:"+ i + " 当前元素为:"+ n + " 当前数组为:" + curAry); })
3. Internal iterator, external iterator
(1) Internal iterator: The iteration rules have been defined, it completely takes over the entire iteration process, and only requires an initial call from the outside. The above custom each is an internal iterator!
(2) External iterator: The iteration of the next element must be requested explicitly.
Example: Determine whether two arrays are equal
Example 1: Internal iterator
// 内部迭代器 var each = function(ary, callback) { for(var i = 0, l = ary.length; i < l; i++) { callback.call(ary[i], i, ary[i]); } }; // 比较函数 var compareAry = function(ary1, ary2) { if(ary1.length != ary2.length) { throw new Error("不相等"); // return console.log("不相等"); } // 且住 each(ary1, function(i, n) { if(n !== ary2[i]) { // return console.log("不相等"); // return 只能返回到each方法外,后续console.log("相等")会继续执行,所以这里得使用throw throw new Error("不相等"); } }); console.log("相等"); } compareAry([1, 2, 3], [1, 2, 4]);
Example 2: External iterator
// 外部迭代器 var Iterator = function(obj) { var current = 0, next = function() { current++; }, isDone = function() { return current >= obj.length; }, getCurrentItem = function() { return obj[current]; }; return { next: next, isDone: isDone, getCurrentItem: getCurrentItem }; }; // 比较函数 var compareAry = function(iterator1, iterator2) { while( !iterator1.isDone() && !iterator2.isDone() ){ if(iterator1.getCurrentItem() !== iterator2.getCurrentItem()) { throw new Error("不相等"); } iterator1.next(); iterator2.next(); } console.log("相等"); } compareAry(new Iterator([1, 2, 3]), new Iterator([1, 2, 4]));
4. Terminate the iterator
var each = function(ary, callback) { for(var i = 0, l = ary.length; i < l; i++) { if(callback.call(ary[i], i, ary[i]) === false) { break; } } } each([1, 2, 4, 1], function(i, n) { if(n > 3) { return false; } console.log(n); });
The above is the detailed content of How to implement JavaScript iterator pattern and detailed explanation of usage examples. For more information, please follow other related articles on the PHP Chinese website!