мини калькулятор
Добрый день , только начинаю учиться JS подскажите пожалуйста есть мини калькулятор . Когда вводишь данные например от 0 до 2000 цена 1.5 от 2000 до 5000 цена 1.3 от 5000 до 30000 цена 1 и после 30000 цена 0.8 .Подскажите что я делаю не так .Спасибо
<script>$(function() { function count() { var a = " 2000"; var b = "5000"; var c = "30000"; var sum = +$("#count_inp").val() || 0; if (sum <= a) { var result = (1.5) * sum; $("#result p").html(result + " Рублей") if (sum >= b) { var result = (1.3) * sum; $("#result p").html(result + " Рублей") } if (sum >= c) { var result = (1) * sum; $("#result p").html(result + " Рублей") } else $("#result p").html("Укажите расстояние"); } else $("#result p").html("Укажите расстояние"); } var s = $("#process_all_b"); s.click(count) }); </script> <div id="calc_div"> <div id="quantity_div"><p class="c"> Сколько километров <br> <input type="text" id="count_inp"><br> </div> <div id="final_div"> <p class="c"><button id="process_all_b" >Посчитать</button><br></p> <div id="result"><p class="c">0 Рублей</p></div> </div> </div> |
Цитата:
|
biben, а что не работает?
В переменной «a» удали пробел перед значением, да и вообще, если работаешь с числами, то значения лучше бы устанавливать как numeric, а не string. |
Цитата:
|
А можете подсказать правильное решение , уже с ночи голову ломаю
|
Цитата:
Цитата:
|
Цитата:
Ты должен самостоятельно научиться решать простые задачи... Научиться тестировать свой код... |
Цитата:
|
Ладно спасибо и на этом:)
|
Цитата:
|
Цитата:
biben, у тебя в коде логическая ошибка связанная с переменной «а», найди её. Решение твоей задачи с циклом: // [url]https://jsfiddle.net/sza10bke/[/url] $(function(){ function count(){ var data={ 2000:1.5, 5000:1.3, 30000:1 }, sum=+$("#count_inp").val() || 0, result=false; for(var val in data){ if(data.hasOwnProperty(val) && sum>=val) result=data[val]*sum; }; $("#result p").html(result===false?'Укажите расстояние':result+' Рублей'); }; var s=$("#process_all_b"); s.click(count); }); |
<htm> <head> </head> <body> <div id="calc_div"> <div id="quantity_div"><p class="c"> Сколько километров <br> <input type="text" id="count_inp" value="0"><br> </div> <div id="final_div"> <p class="c"><button id="process_all_b" >Посчитать</button><br></p> <div id="result"><p class="c">Укажите расстояние</p></div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script> $(function() { $("#process_all_b").click(function(){ var sum = $("#count_inp").val(), k = [1.5, 1.3, 1, 0.8], r = [0, 2000, 5000, 30000], i = k.length ; while(i--) if (sum >= r[i]) { sum *= k[i]; break; } $("#result p").html(sum.toFixed(0)+' Рублей'); }); }); </script> </body> </html> |
Цитата:
|
Цитата:
|
После кода j0hnik я понял, что у меня в коде в объекте «data» не хватает свойства «0» со значением 2.
А у j0hnik в коде я бы переменную «i» объявил самой последней и значение ей установил бы как «k.length». + условие немного некорректное, у автора сравнение идет «больше или равно», а не строго «больше». Также отсутствует проверка на корректность введенных данных, к примеру если ввести отрицательное число, то... |
Цитата:
"Изготовитель" не гарантирует "правильность" сортировки ключей в объекте. Для правильного 100%-ного порядка следования нужно использовать массив. ;) |
Цитата:
|
Цитата:
UPD. Затупил, ошибка возможна :) |
Цитата:
|
Цитата:
Т.к. не каждого устроит индусский код |
Цитата:
|
Цитата:
|
Цитата:
Час назад закончил собеседование со студентом магистратуры, ему объяснял те же постулаты. :( |
biben,
Оставь телефончик, цена перевозок порадовала =) |
Цитата:
Нет гарантии того, что данные будут введены отсортированными, т.е. перед тем, как гонять данные в цикле, нужно будет обязательно отсортировать их, а это в любом случае придется пробежаться по всему объекту данных (typeof []=='object'). Т.е. в этом случае нам нужно будет аж 2 раза в цикле работать с массивом данных. Что более индусский код, два раза гонять в цикле один и тот же объект или сделать это единожды? $(function(){ function count(){ var data={ 0:2, 2000:1.5, 5000:1.3, 30000:1 }, sum=+$("#count_inp").val() || 0, last_v=-999999, result=false; for(var val in data){ if(data.hasOwnProperty(val) && sum>=val && last_v<val){ result=data[val]*sum; last_v=val; }; }; $("#result p").html(result===false?'Укажите расстояние':result+' Рублей'); }; $("#process_all_b").click(count); }); |
Цитата:
Так же у массивов есть метод sort() который так же сможет нам помочь... Но ты волен остаться при своем мнении, т.к. нас не связывают производственные отношения и я тебе не босс. :) |
Цитата:
Про метод «sort» знаю, но если хранить данные в виде объекта (как я и сделал), то этому методу нужно будет передавать функцию, которая будет сортировать элементы массива. Если в кач-ве контейнеров для данных использовать 2 массива (как это сделал Джоник), то можно использовать «sort» без функции, но теряется связь «ключ-значение». Метод «sort», я считаю, в любом случае пробежится по всем элементам объекта для того, чтобы его отсортировать. Я веду с тобой диалог (спор), поскольку считаю, что в моих словах есть смысл. В споре, как известно, рождается истина. Если у тебя нет желания продолжать, то жаль конечно, но ничего не поделаешь. |
:write: вариант предложенный ksa, напомню some остановит цикл на первом правильном результате ...
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $(function() { $("#process_all_b").click(function() { var d = [{ value: 30000, ratio: .8 }, { value: 5000, ratio: 1 }, { value: 2000, ratio: 1.3 }, { value: 0, ratio: 1.5 }], a = +$("#count_inp").val() || 0, b = "Укажите расстояние"; a && d.some(function(c) { return a > c.value && (b = (a * c.ratio).toFixed(2) + " Рублей") }); $("#result p").html(b) }) }); </script> </head> <body> <div id="calc_div"> <div id="quantity_div"><p class="c"> Сколько километров </p> <input type="text" id="count_inp"><br> </div> <div id="final_div"> <p class="c"><button id="process_all_b" >Посчитать</button><br></p> <div id="result"><p class="c">0 Рублей</p></div> </div> </div> </body> </html> |
Цитата:
var d = [{ value: 30000, ratio: 1 }, { value: 5000, ratio: 1.3 }, { value: 0, ratio: 2 }, { value: 2000, ratio: 1.5 }]; |
Цитата:
Свои аргументы я высказал. |
Цитата:
|
Цитата:
|
Цитата:
У объекта к ключам такое требование не предъявишь. Т.к. не повлияешь на то как клиентская машина их "разместит". Отсюда и разница в алгоритмах... Одно дело если исходные данные уже такие, какие есть и работать приходится только с этим. Тут куда деваться... :( Но когда сам специально делаешь хранение неудобным и потом "мужественно преодолеваешь препятствия". Это уже не совсем правильное решение задачи. :) |
Цитата:
Цитата:
|
Цитата:
|
рони, признаться, не помню проекта, где необходимо было сортировать массив на стороне клиента.
Не могли бы Вы объяснить почему считаете, что я не знаю про метод «sort»? |
Nexus,
думаю всем сейчас понятно, что массив должен быть от сортирован перед использованием, только это было основной мыслью, моего послания. |
Цитата:
|
Цитата:
|
Да просто звучит как аксиома. :) Честное слово, о чем вы тут дебаты ведете даже не вникал, к конкретному случаю, наверное да, нужна.
|
Часовой пояс GMT +3, время: 08:19. |