 
			
				14.03.2018, 12:06
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 26.12.2016 
					
					
					
						Сообщений: 6
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Почему в for неправильная итерация массива
			 
			
		
		
		
		Нашел задачу в которой дается массив и нужно удалить все четные числа методом for 
var a = [1, 2, 2, 2, 2, 3, 4];
for (var i = 0; i < a.length; i++) {
  if ((a[i] % 2) == 0) {
    a.splice(i, 1);
  }
}
alert(a);   // [1, 2, 2, 3]
почему в for неправильная итерация массива не могу понять  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ermak20, 14.03.2018 в 12:13.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:21
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ermak20
			
		
	 | 
 
	| 
		почему в for неправильная итерация массива
	 | 
 
	
 
 С итерацией все в порядке, просто вы модифицируете массив.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:22
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 07.03.2011 
					
					
					
						Сообщений: 1,141
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ты ошибаешься в for все нормально просто ты изменяешь массив т.е. удаляешь из него элементы. 
<iframe width="360" height="215" src="https://www.youtube.com/embed/9P1YCLhpvpc" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:25
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		for корректно работает. 
Когда вы удаляете элемент из массива, то его длинна (и кол-во итераций цикла) уменьшаются, при этом счетчик (i) уже указывает на следующий после удаленного элемент массива, из-за этого такой результат. 
Для решения проблемы можно воспользоваться методом filter массивов либо в цикле заполнить новый массив необходимыми значениями, а после цикла старый заменить новым.
 
Пример с методом "filter":
 
var a = [1, 2, 2, 2, 2, 3, 4].filter(val=>val%2!=0);
alert(a);   // [1, 3]
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:27
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 13.03.2018 
					
					
					
						Сообщений: 17
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Ты удаляешь элементы из массива а[],  а потом обращаешься к элементу например с индексом 5 а[5] а его уже нет в этом массиве(там осталось только 5 элементов , то есть последний элемент это  a[4]) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:31
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Nexus, 
 достаточно проверить последний разряд числа - у нечетных чисел он равен 1.
 
alert([1, 2, 2, 2, 2, 3, 4].filter(n=>n & 1))
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:34
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 laimas, если бы я такой код в кач-ве примера выкатил, то от кода тс остался бы только сам массив ) 
 
Но все равно спасибо, не знал об этом. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:36
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Nexus
			
		
	 | 
 
	| 
		не знал об этом
	 | 
 
	
 
 А что же не знать, арифметика то в любом случае будет двоичной.    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:52
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		laimas, 
	
 
	| 
		
			Сообщение от laimas
			
		
	 | 
 
	| 
		А что же не знать
	 | 
 
	
 
 ну, не знать всегда есть что. 
Правильнее сказать, что я не догадывался, что так можно проверить четность числа.
 
Побитовыми операциями вроде вообще никогда не пользовался, вероятно из-за этого и не догадался бы никогда, что можно использовать побитовое И.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.03.2018, 12:59
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Nexus
			
		
	 | 
 
	| 
		Побитовыми операциями вроде вообще никогда не пользовался
	 | 
 
	
 
 Ну так эффективнее сравнить младший бит числа, чем делить число по модулю, почему же не использовать. А четное число или нечетное если не важны десятичные результата, выгоднее не делить, а сдвинуть на N разрядов вправо, например на 1 разряд при делении на два. Соответственно при умножении сдвиг влево.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось laimas, 14.03.2018 в 13:01.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |