 
			
				10.07.2011, 19:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Array each function
			 
			
		
		
		
		требуется быстрая функция для обхода массива, исполняя на каждой итерации функцию. Должна быть возможность прервать цикл. 
пока смог реализовать через замыкание.
 
для чего это мне понадобилось, покажу на абстрактных примерах   
порядок обхода совершенно безразличен. я могу сделать reverse, если что.
 Пример: через замыкание 
function each(arr, func) {
var al = arr.length, breaked = false;
do 
    func( arr[al],  al , arr, function(){ breaked=true } );
while (    al-- > 0  &&   breaked==false    ) 
}
var log=[];
each( [1,2,3,"break it",4,5,6,7],    function(a,b,c,d){
                                                         log.push(a);
                                                         a==='break it' && d();
} );
alert( "Прошли : \n\n"+ log.join("\n") )
сильно хочется сделать это через метки, но не могу.
 
подскажите, пожалуйста, как лучше всего сделать  функцию обхода массива с возможностью прерывания 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось melky, 10.07.2011 в 19:46.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 19:28
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 ⊞ Развернуть 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2010 
					
					
					
						Сообщений: 1,810
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		как лучше всего сделать функцию обхода массива с возможностью прерывания
	 | 
 
	
 
 Взять обычную и выбросить исключение.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 19:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		кажется, сам не стал бы так писать    да?
 Пример: через исключение 
var log=[];
try { 
        [1,2,3,"break it",4,5,6,7].forEach ( function(a){ 
                        log.push(a);
                         if(  a==='break it' ) throw "";
                       } );
 } catch (e) {}
alert( "Прошли : \n\n"+ log.join("\n") )
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:05
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я, наверное, что-то не очень понял... 
_log=[];
arr=[1, 2, 3, 4, 5, false, 6, 7];
function each(arr, func) {
 for (var i=0; i!= arr.length; ++i) {
  _log.push(arr[i]);
  if(func(arr[i], i, arr)===false) break;
};
};
each(arr, function(a, b, c){if (a===false) return false});
alert(_log);
Нет?  
		
	
		
		
		
		
		
			
		
		
		
		
		
						  
				
				Последний раз редактировалось trikadin, 10.07.2011 в 20:15.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:17
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		как лучше всего сделать функцию обхода массива с возможностью прерывания
	 | 
 
	
 
 Стандартные  some/every.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:25
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		И для кроссбраузерности: 
Array.prototype.every= Array.prototype.every || function (func, thisObj) {
for (var i=0; i!= this.length; ++i)
 if (i in this && func.call(thisObj, this[i], i, this))
   return false;
 return true;
};
Ну и some так же...  
		
	
		
		
		
		
		
			
		
		
		
		
		
						  
				
				Последний раз редактировалось trikadin, 10.07.2011 в 21:11.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:38
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от trikadin
			
		
	 | 
 
	| 
		if (!Array.every)
	 | 
 
	
 
 Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:46
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Тлен 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.01.2010 
					
					
					
						Сообщений: 6,601
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Kolyaj
			 
		
	 | 
 
	| 
		Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.
	 | 
 
	
 
 =) 
Как это типично...))  
		
	
		
		
		
		
		
			
				__________________ 
				29375, 35 
 
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 20:54
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Поправил, виноват... 
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				10.07.2011, 21:00
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ещё нужна проверка i in this, и callback функция не обязана возвращать строго false. 
http://alljs.ru/s/files/Array.js 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |