Пришло время, когда надоело писать конструкции вида for( var i=0;i<element .items.length; i++ ){ … } настолько, что задумался насчет итераторов, слегка упрощающих жизнь.
Статьи по этой теме попадались скудные, поэтому решил написать свое решение.
Код итератора:
window.each = function( /*arr*/ ){ for( var i=0;i<arguments.length; i++ ){ if( arguments[i].each ){ arguments[i].ikey = arguments[i].iterator = 0; } } } window.loop = function( /*arr*/ ){ var res = true; for( var i=0;i<arguments.length; i++ ){ if( arguments[i].loop ){ res = res & arguments[i].loop(); } } return res; } Array.prototype.each = function(){ this.ikey = this.iterator = 0; } Array.prototype.loop = function(){ if( typeof(this.ikey) == 'undefined' ){ this.ikey = this.iterator = 0; } if( this.iterator < this.length ){ this.ikey = this.iterator; this.ival = this[ this.iterator++ ]; // item's key (ikey) & item's value (ivalue) return true; } this.ikey = this.iterator = 0; return false; } Array.prototype.isArray = true; function isArray( variable ){ return (variable.isArray) ? true : false; }
Пример использования:
var abc = [ 1, 2, 3, 4, 5, 6, 7 ]; for(each(abc);loop(abc);){ console.log( abc.ikey, abc.ival ); } var def = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]; for(def.each();def.loop();){ console.log( def.ikey, def.ival ); }
Можно вообще не использовать each(), он нужен только для сброса позиции итератора. То есть, если из цикла нет выхода по break, то позиция сбрасывается автоматом в конце цикла:
var def = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]; for(;def.loop();){ console.log( def.ikey, def.ival ); }
Кроме того, используя функции each и loop, можно одновременно пролистать несколько массивов. Но нужно иметь в виду, что количество итераций будет равно количеству элементов в самом меньшем массиве.
var arr1 = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]; var arr2 = [ 1, 2, 3, 4, 5 ]; for(each(arr1,arr2);loop(arr1,arr2);){ console.log( arr2.ival, arr1.ival ); }