Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   мини калькулятор (https://javascript.ru/forum/jquery/70092-mini-kalkulyator.html)

Nexus 09.08.2017 16:07

Цитата:

Сообщение от ksa (Сообщение 461118)
Зачем делать лишние итерации? :blink:

Размер объекта очень вряд ли когда нибудь перевалит хотя бы за сотню, а что такое пробежаться по сотне свойств во временных затратах?

j0hnik 09.08.2017 16:09

Цитата:

Сообщение от Nexus (Сообщение 461114)
к примеру если ввести отрицательное число, то...

То водитель сам приплачивать заказчику должен :D

ksa 09.08.2017 16:12

Цитата:

Сообщение от Nexus
а что такое пробежаться по сотне свойств во временных затратах?

Я не сторонник индусских кодов...

Час назад закончил собеседование со студентом магистратуры, ему объяснял те же постулаты. :(

j0hnik 09.08.2017 16:19

biben,
Оставь телефончик, цена перевозок порадовала =)

Nexus 09.08.2017 16:27

Цитата:

Сообщение от ksa (Сообщение 461123)
Я не сторонник индусских кодов...

Час назад закончил собеседование со студентом магистратуры, ему объяснял те же постулаты. :(

Ок, не спорю, лишние итерации - не хорошо, но вот вопрос:
Нет гарантии того, что данные будут введены отсортированными, т.е. перед тем, как гонять данные в цикле, нужно будет обязательно отсортировать их, а это в любом случае придется пробежаться по всему объекту данных (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);
});

ksa 10.08.2017 08:32

Цитата:

Сообщение от Nexus
Нет гарантии того, что данные будут введены отсортированными, т.е. перед тем, как гонять данные в цикле, нужно будет обязательно отсортировать их

Хоть сами элементы массива могут располагаться как угодно (как и ключи) но цикл от 0 до N выберет их в нужной нам последовательности.
Так же у массивов есть метод sort() который так же сможет нам помочь...

Но ты волен остаться при своем мнении, т.к. нас не связывают производственные отношения и я тебе не босс. :)

Nexus 10.08.2017 09:27

Цитата:

Сообщение от ksa (Сообщение 461179)
Хоть сами элементы массива могут располагаться как угодно (как и ключи) но цикл от 0 до N выберет их в нужной нам последовательности.
Так же у массивов есть метод sort() который так же сможет нам помочь...

Но ты волен остаться при своем мнении, т.к. нас не связывают производственные отношения и я тебе не босс. :)

Я имел ввиду, что "нужная нам последовательность" может быть некорректной, т.е. не «1,2,3», а «2,1,3».
Про метод «sort» знаю, но если хранить данные в виде объекта (как я и сделал), то этому методу нужно будет передавать функцию, которая будет сортировать элементы массива.
Если в кач-ве контейнеров для данных использовать 2 массива (как это сделал Джоник), то можно использовать «sort» без функции, но теряется связь «ключ-значение».
Метод «sort», я считаю, в любом случае пробежится по всем элементам объекта для того, чтобы его отсортировать.

Я веду с тобой диалог (спор), поскольку считаю, что в моих словах есть смысл.
В споре, как известно, рождается истина.
Если у тебя нет желания продолжать, то жаль конечно, но ничего не поделаешь.

рони 10.08.2017 10:04

: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>

Nexus 10.08.2017 10:14

Цитата:

Сообщение от Nexus
Я имел ввиду, что "нужная нам последовательность" может быть некорректной, т.е. не «1,2,3», а «2,1,3».

На примере рони, если переменную «d» задать так и ввести в поле 2500, то результат будет неверным:
var d = [{
                value: 30000,
                ratio: 1
            }, {
                value: 5000,
                ratio: 1.3
            }, {
                value: 0,
                ratio: 2
            }, {
                value: 2000,
                ratio: 1.5
            }];

ksa 10.08.2017 10:31

Цитата:

Сообщение от Nexus
Я веду с тобой диалог (спор), поскольку считаю, что в моих словах есть смысл.

Потому и написал, что дело твое как тебе строить алгоритмы... :)
Свои аргументы я высказал.


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