 
			
				30.09.2014, 14:46
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 4
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Помогите упростить скрипт
			 
			
		
		
		
		С целью уменьшения объёма кода хотелось бы использовать массивы и циклы. Но как это грамотно сделать, пока не понимаю, хотя перечитал массу учебников по теме. 
function calculator(form)
{
k1 = form.k1.value;
k2 = form.k2.value;
k3 = form.k3.value;
x1 = k1;
switch (x1)
{ 
case "Игра 1 " : a1=1 , a2=1 , a3=""; break;
case "Игра 2 " : a1=1 , a2="" , a3=1; break;
case "Игра 3 " : a1="" , a2=1 , a3=1; break;
case "Резерв " : a1=0 , a2=0 , a3=0; break;
default:  a1="" , a2="" , a3="";
}
x2 = k2;
switch (x2)
{       
case "Игра 1 " : b1=1+a1 , b2=1+a2 , b3=""; break;
case "Игра 2 " : b1=1+a1 , b2="" , b3=1+a3; break;
case "Игра 3 " : b1="" , b2=1+a2 , b3=1+a3; break;
case "Резерв " : b1=0 , b2=0 , b3=0; break;
default:  b1="" , b2="" , b3="";
}
x3 = k3;
switch (x3)
{       
case "Игра 1 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=""; break;
case "Игра 2 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2="" , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
case "Игра 3 " : c1="" , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
case "Резерв " : c1=0 , c2=0 , c3=0; break;
default:  c1="" , c2="" , c3="";
}
d1 = Math.ceil(a1/100)+Math.ceil(b1/100)+Math.ceil(c1/100);
d2 = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
d3 = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);
if (a1=="0") {
var a1 = "Р";
}
if (a2=="0") {
var a2 = "Р";
}
if (a3=="0") {
var a3 = "Р";
}
if (b1=="0") {
var b1 = "Р";
}
if (b2=="0") {
var b2 = "Р";
}
if (b3=="0") {
var b3 = "Р";
}
if (c1=="0") {
var c1 = "Р";
}
if (c2=="0") {
var c2 = "Р";
}
if (c3=="0") {
var c3 = "Р";
}
form.total1.value = a1;
form.total2.value = a2;
form.total3.value = a3;
form.total4.value = b1;
form.total5.value = b2;
form.total6.value = b3;
form.total7.value = c1;
form.total8.value = c2;
form.total9.value = c3;
form.total10.value = d1;
form.total11.value = d2;
form.total12.value = d3;
}
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 21:17
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 CacheVar 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.08.2010 
					
					
					
						Сообщений: 14,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Эдвард
			
		
	 | 
 
	| 
		хотелось бы использовать массивы
	 | 
 
	
 
 Замени все свои переменные с цифрами на массивы
 
x1 ----> x[0]
x2 ----> x[1]
xN ----> x[N-1]
 
Особо в твой скрипт не вникал... Но. 
Если все переменные с одинаковой цифрой - суть характеристики одного элемента - это можно оформить как объект...
 
{a: <значение_А>, b: <значение_Б>, ...}
Потом можно будет совместить "массив" с "объектом" - т.о. можно будет применять циклы.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ksa, 30.09.2014 в 21:20.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 22:41
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 4
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 К сожалению, без конкретных примеров мне не разобраться. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.10.2014, 04:37
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.10.2010 
					
					
					
						Сообщений: 2,718
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 У меня младшая проходит переменные: 
 
form.total1.value = a1; 
 
form[1].value = a[1]; 
 
c=1; 
form[c].value = a[c]; 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.10.2014, 12:31
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.12.2013 
					
					
					
						Сообщений: 1,856
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Эдвард
			 
		
	 | 
 
	| 
		К сожалению, без конкретных примеров мне не разобраться.
	 | 
 
	
 
 Например:
 
//твой код
x3 = k3;
switch (x3)
{      
case "Игра 1 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=""; break;
case "Игра 2 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2="" , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
case "Игра 3 " : c1="" , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
case "Резерв " : c1=0 , c2=0 , c3=0; break;
default:  c1="" , c2="" , c3="";
}
 
d1 = Math.ceil(a1/100)+Math.ceil(b1/100)+Math.ceil(c1/100);
d2 = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
d3 = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);
//укороченная версия
x3 = k3;
var one = Math.ceil(a1/100)+Math.ceil(b1/100);
var two = 1+Math.ceil(a2/100)+Math.ceil(b2/100);
var three = 1+Math.ceil(a3/100)+Math.ceil(b3/100);
switch (x3)
{      
case "Игра 1 " : c1=1+one , c2=two , c3=""; break;
case "Игра 2 " : c1=1+one , c2="" , c3=three; break;
case "Игра 3 " : c1="" , c2=two , c3=three; break;
case "Резерв " : c1=0 , c2=0 , c3=0; break;
default:  c1="" , c2="" , c3="";
}
 
d1 = one+Math.ceil(c1/100);
d2 = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
d3 = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);
Писал второпях, по этому возможны логические ошибки, но суть, думаю, ты понял.
 
Как я понял, ты определяешь переменные без ключевого слова  var. Если так, то это очень плохо.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.10.2014, 21:27
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 4
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Safort
			
		
	 | 
 
	| 
		Например:
	 | 
 
	
 
 Такой метод уже пробовал использовать, и хоть он слегка сокращает скрипт, всё же это немного не то, т. к. отсутствуют массивы и циклы. Главная цель – сократить сами формулы за счёт объединения повторяющихся элементов.
 
	
 
	| 
		
			Сообщение от Safort
			
		
	 | 
 
	| 
		определяешь переменные без ключевого слова var. Если так, то это очень плохо
	 | 
 
	
 
 Много где читал, что это плохо, но почему именно, так и не понял.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.10.2014, 21:04
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 4
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Упростил свою задачу по-максимуму, но преобразовать в массив так и не получается:  http://med-75.hol.es/1/8.html :
 
<html>
<meta charset="utf-8">
<head>
<script type="text/javascript">
function calculator(form) {
var e1 = form.e1.value;
var e2 = form.e2.value;
var e3 = form.e3.value;
switch (e1)
{	
case "ab" : a1=1 , b1=1 , c1=""; break;
case "ac" : a1=1 , b1="" , c1=1; break;
case "bc" : a1="" , b1=1 , c1=1; break;
default:  a1="" , b1="" , c1="";
}
switch (e2)
{	
case "ab" : a2=1 , b2=1 , c2=""; break;
case "ac" : a2=1 , b2="" , c2=1; break;
case "bc" : a2="" , b2=1 , c2=1; break;
default:  a2="" , b2="" , c2="";
}
switch (e3)
{	
case "ab" : a3=1 , b3=1 , c3=""; break;
case "ac" : a3=1 , b3="" , c3=1; break;
case "bc" : a3="" , b3=1 , c3=1; break;
default:  a3="" , b3="" , c3="";
}
form.a1.value = a1;
form.a2.value = a2;
form.a3.value = a3;
form.b1.value = b1;
form.b2.value = b2;
form.b3.value = b3;
form.c1.value = c1;
form.c2.value = c2;
form.c3.value = c3;
}
</script>
</head>
<style type="text/css">
    .s1 {
      text-align: center;
      font-weight: bold;
      width: 100px;
    }
</style>
<form name="f1">
<select name="e1" class="s1">
 <option>ab</option>
 <option>ac</option>
 <option>bc</option>
</select>
<select name="e2" class="s1">
 <option>ab</option>
 <option>ac</option>
 <option>bc</option>
</select>
<select name="e3" class="s1">
 <option>ab</option>
 <option>ac</option>
 <option>bc</option>
 </select>
<br>
<input name="a1" type="text" class="s1"> <input name="a2" type="text" class="s1"> <input name="a3" type="text" class="s1">
<br>
<input name="b1" type="text" class="s1"> <input name="b2" type="text" class="s1"> <input name="b3" type="text" class="s1">
<br>
<input name="c1" type="text" class="s1"> <input name="c2" type="text" class="s1"> <input name="c3" type="text" class="s1">
<br><br>
<input type="button" value="Калькуляция" onClick="calculator(this.form)">
<input type="reset" value="Сброс">
</form>
</html>
В идеале вместо трёх switch-ей должен быть один – например, такой:
 
switch (e[i])
{	
case "ab" : a[i]=1 , b[i]=1 , c[i]=""; break;
case "ac" : a[i]=1 , b[i]="" , c[i]=1; break;
case "bc" : a[i]="" , b[i]=1 , c[i]=1; break;
default:  a[i]="" , b[i]="" , c[i]="";
}
Но опять же встаёт вопрос, как грамотно заполнить массивы для переменных e, a, b, c и создать для них соответствующий цикл.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |