мини калькулятор
Добрый день , только начинаю учиться 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, время: 01:12. |