Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Помогите упростить скрипт (https://javascript.ru/forum/css-html/74879-pomogite-uprostit-skript.html)

Dmitriy8804 14.08.2018 09:17

Помогите упростить скрипт
 
Добрый день. Я - начинающий программист. Не пожскажете как сократить такой код. скрипт нужен для вычисления стоимости электромонтажных работ на сайте.


function calcCost(){
//создаем массив, в котором храним данные, в которые ниже присвоим
//стоимость отдельных работ.
var arrResult = ['result1', 'result2', 'result3', 'result4', 'result5',
'result6', 'result7', 'result8', 'result9', 'result10', 'result11',
'result12', 'result13', 'result14', 'result15', 'result16', 'result17',
'result18','result19', 'result20', 'result21', 'result22', 'result23',
'result24', 'result25', 'result26', 'result27', 'result28', 'result29',
'result30']; //создаем массив, в кот. храним все пункты работ
//присваиваем каждому элементу массива элемент из html, умножаем на суму стоимости работы и преобразуем строку в число


arrResult[0] = parseInt(document.getElementById('input1').value * 16);
arrResult[1] = parseInt(document.getElementById('input2').value * 50);
arrResult[2] = parseInt(document.getElementById('input3').value * 11);
arrResult[3] = parseInt(document.getElementById('input4').value * 8);
arrResult[4] = parseInt(document.getElementById('input5').value * 12);
arrResult[5] = parseInt(document.getElementById('input6').value * 7);
arrResult[6] = parseInt(document.getElementById('input7').value * 6);
arrResult[7] = parseInt(document.getElementById('input8').value * 55);
arrResult[8] = parseInt(document.getElementById('input9').value * 38);
arrResult[9] = parseInt(document.getElementById('input10').value * 65);
arrResult[10] = parseInt(document.getElementById('input11').value * 46);
arrResult[11] = parseInt(document.getElementById('input12').value * 36);
arrResult[12] = parseInt(document.getElementById('input13').value * 40);
arrResult[13] = parseInt(document.getElementById('input14').value * 20);
arrResult[14] = parseInt(document.getElementById('input15').value * 40);
arrResult[15] = parseInt(document.getElementById('input16').value * 50);
arrResult[16] = parseInt(document.getElementById('input17').value * 20);
arrResult[17] = parseInt(document.getElementById('input18').value * 300);
arrResult[18] = parseInt(document.getElementById('input19').value * 200);
arrResult[19] = parseInt(document.getElementById('input20').value * 38);
arrResult[20] = parseInt(document.getElementById('input21').value * 48);
arrResult[21] = parseInt(document.getElementById('input22').value * 58);
arrResult[22] = parseInt(document.getElementById('input23').value * 68);
arrResult[23] = parseInt(document.getElementById('input24').value * 75);
arrResult[24] = parseInt(document.getElementById('input25').value * 115);
arrResult[25] = parseInt(document.getElementById('input26').value * 80);
arrResult[26] = parseInt(document.getElementById('input27').value * 100);
arrResult[27] = parseInt(document.getElementById('input28').value * 170);
arrResult[28] = parseInt(document.getElementById('input29').value * 75);
arrResult[29] = parseInt(document.getElementById('input30').value * 90);
arrResult[30] = parseInt(document.getElementById('input31').value * 40);

var resultCommon = arrResult[30] + arrResult[29] + arrResult[28] +
arrResult[27] + arrResult[26] + arrResult[25] + arrResult[24] + arrResult[23] +
arrResult[22] + arrResult[21] + arrResult[20] + arrResult[19] + arrResult[18] +
arrResult[17] + arrResult[16] + arrResult[15] + arrResult[14] + arrResult[13] +
arrResult[12] + arrResult[11] + arrResult[10] + arrResult[9] + arrResult[8] +
arrResult[7] + arrResult[6] + arrResult[5] + arrResult[4] + arrResult[3] +
arrResult[2] + arrResult[1] + arrResult[0];
//складываем все работы

var oi = document.getElementById('out');
oi.textContent = resultCommon + ' ГРИВЕН';
};

j0hnik 14.08.2018 09:41

Вот почитайте

циклы
https://learn.javascript.ru/while-for

forEach
https://developer.mozilla.org/ru/doc.../Array/forEach

reduce
https://developer.mozilla.org/ru/doc...s/Array/Reduce

Aetae 14.08.2018 09:54

Красиво и аккуратно сделать так: присвоить каждому инпуту единый класс и в аттрибуте каждого инпута хранить множитель, чтобы при добавлении нового или удалении не лезть в код, примерно так:
<input class="cost" type="number" data-multiplier="12">
Далее уже использовать примерно такой код:
var inputs = document.querySelectorAll('.cost'), i = inputs.length, cost = 0;

while(i--) {  
  cost += inputs[i].value * inputs[i].getAttribute('data-multiplier');
}

document.getElementById('out').appendChild(
  document.createTextNode(cost + ' ГРИВЕН')
);

j0hnik 14.08.2018 09:56

не заполняя data-multiplier, а заполняя массив
var arr = [16,50,11,8];//заполните сами
document.getElementById('out').textContent = 
arr.reduce((s, el, i) => (document.getElementById('input'+(i+1)).value * el) + s,0)+ ' ГРИВЕН';

Aetae 14.08.2018 10:05

j0hnik, с массивом быстро данные разайдутся с реальностью, гарантия.)
Если уж юзать массив, то тогда и создание разметки в js переносить надо. (ну или юзать фреймворк который всё это сам свяжет)

j0hnik 14.08.2018 10:06

Aetae,
да, согласен, данные в кучу!

Dmitriy8804 14.08.2018 21:25

он не все будет вводить. все инпуты это виды работ, а конкретнее за вид электромонтажных работ.

Aetae 14.08.2018 21:31

Dmitriy8804, не принципиально, пустое поле считается нулём:
alert('' * 2)
Если нужна дополнительная валидация - для input type number можно задать step, min и max, не приплетая js.

Dmitriy8804 14.08.2018 21:39

не пойму и не могу найти что такое 'data-multiplier'

Aetae 14.08.2018 22:20

Dmitriy8804, потому что это я придумал прямо тут.)
https://developer.mozilla.org/ru/doc...ata_attributes


Часовой пояс GMT +3, время: 01:26.