Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Суммировать индекси двух массива (https://javascript.ru/forum/jquery/76386-summirovat-indeksi-dvukh-massiva.html)

Hovik 07.01.2019 15:36

Суммировать индекси двух массива
 
Здравствуйте у меня такой вопрос, как можно умножить индекси двух массивах ?.

<div class="calc1">
<span>1dr</span>
<span>2dr</span>
<span>3dr</span>
<span></span>
<input type="text"></input>
<input type="text"></input>
<input type="text"></input>
<input type="text" disabled></input>

</div>


<div class="block1"></div>
<button class="btn">button</button>
1- получаем всё input у которых нет disabled ,
2- получаем всё span которые не пустые и делаем parseint
3- умножим индекс первого массива с индексом второго массива.
4- запишем результат в .block1

Заранее благодарю за ответ.

var inputs = $(".calc input").get();
var spans = parseint($(".calc span").text().get());

laimas 07.01.2019 15:53

Цитата:

Сообщение от Hovik
$(".calc input")

Это как если имя класса calc1?

var p = $(".calc1").children(),
    input = p.filter('input:not(:disabled)'), //1
    span = p.filter('span:not(:empty)'); //2 get() - это уже DOM набор


3) - что значит умножить индекс?

Hovik 07.01.2019 16:41

В input выведется цифры , в span цифры и строка,
span parseint вычесляем цифры.
var spans = Array(цифры из span);
var inputs = Array(введение цыфры);
spans [ x] * inputs [ x] ;

laimas 07.01.2019 16:48

Цитата:

Сообщение от Hovik
В input выведется цифры , в span цифры и строка

И как вы собираетесь умножать стоку? Если же есть span содержащие только числа, то тогда нужно фильтром выбрать именно такие, и если такие будут, то только тогда умножать. Впрочем как и требуется проверка не пусто ли поле, или присваивать 0, если не пусто.

Hovik 07.01.2019 16:52

По моему здесь логика должен быть таким.
Праверяем if input != ""; патамучта кагда оно пуста то выводить nan.
Патом while или foreach вычесляем индекси из двух массивах и умножим друг другу 0*0, 1*1, 2*2, 3*3 ...

Hovik 07.01.2019 16:55

Функция parseInt() разве не вычесляет цыфры из строк?

laimas 07.01.2019 17:20

Цитата:

Сообщение от Hovik
вычесляем индекси из двух массивах

Зачем? Получить по условию можно так:

var p = $(".calc1").children(),
    span = p.filter(function() {
        return this.textContent.match(/^\d$/)
    }), //только те, в которых числа
    input = p.filter(function() {
        return this.type=='text' && !this.disabled && this.value.match(/^\d$/)
    }); //только если не пустое значение и число


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

laimas 07.01.2019 17:23

Цитата:

Сообщение от Hovik
parseInt() разве не вычесляет цыфры из строк?

Она вообще ничего не вычисляет, она преобразовывает строку в число если возможно. Если это является условием, то проверяйте это в фильтре.

Hovik 07.01.2019 18:00

Я извиняюсь, ошибка было моей. Я должен был сказать вам что это калькулятор и в span написание цену за единицу + руб. а в input каличество , результат будет записаться в div class blok1

laimas 07.01.2019 18:16

И это может быть набором таких значений и число обеих наборов (не пустых) всегда равно?

PS. Если калькулятор, то видимо нужно брать не просто непустые и разрешенные, а пары, соотносящиеся друг к другу элементы?

Hovik 07.01.2019 19:32

Да вы правы

Hovik 07.01.2019 19:43

Да вы правы, и ещё я и сверстаю flex ом и span и в отдельном диве, воабшем получается сплашная каша.

laimas 07.01.2019 20:08

Если так, то выбирать span непустые и разрешенные поля, это не лучшее что можно придумать. Такое возможно, если при любом раскладе элементы одного набора будут гарантированно иметь "вторую половину" в другом наборе и под теми же индексами.

Если span содержит цены, а поля ввода, это количество, то цену выгоднее содержать в самом поле ввода в атрибуте data-... (чисто цена, без всяких руб. и т.п.). По событию ввода в поле нужно удалять не цифровые символы из него и производить расчет. А для этого достаточно пройти циклом (здесь можно использовать единственный фильтр - разрешенные), умножая их значения на значения из атрибута data-..., и суммируя. А span в расчетах вообще не используется.

Hovik 07.01.2019 21:20

Да видно что у вас большая опыт, это хорошая идея, сейчас пабробаю сам сделать, если будут вопросы то обращаюсь к вам. Царские Спасибо вам.

Hovik 09.01.2019 00:10

Здравствуйте laimas, я пробовал кое-что получилось, но не все к сожалению. две значение друг к другу умножается, но вот только не знаю как патом суммировать все это чтобы получил общую сумму.

$('.calc1_btn').click(function(){ 
$ ('#calc .calc1_input input').not("[disabled]").each (function (index) {
     let input = ($ (this).val ());
     let  data =($('#calc .calc1_input input').not("[disabled]").data("price"));
     let inputs = input * data; 
      
     console.log(input); 
     console.log(data); 
     console.log(inputs);
     $('.calc_result p').html(inputs);
});});


<div class="calc1_input calc_one">
      <span>Քանակ</span>
      <input type="text" data-price="5000">
      <input type="text" data-price="5000">
      <input type="text" data-price="5000">
    </div>
<button class="calc1_btn">сумм</button>
<div class="calc_result"> <p></p></div>

рони 09.01.2019 00:33

Hovik,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Hovik 09.01.2019 00:50

Сделал

рони 09.01.2019 01:56

Hovik,
$('.calc1_btn').click(function(){ 
let inputs = 0;
$ ('#calc .calc1_input input').not("[disabled]").each (function (index) {
     let input = ($ (this).val ());
     let  data =($('#calc .calc1_input input').not("[disabled]").data("price"));
      inputs += input * data; 
      
     console.log(input); 
     console.log(data); 
     console.log(inputs);
     });
$('.calc_result p').html(inputs);

});

Hovik 09.01.2019 02:48

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

Hovik 09.01.2019 03:00

и еще хорошо было если мы могли объединить эти две функции я пробовал разные варианты, но не получилось, проблема по моему в действие одна сработает при клике, а другая при смене option.

var AMD = 1;
var RUB = 8;
var USD = 480;


 $('#valute').change(function(){
    if($('#valute option:selected').val() == 'AMD'){ var valute = AMD; }
    else if($('#valute option:selected').val() == 'USD'){ var valute = USD;}
    else{ var valute = RUB;} console.log(valute);});


$('.calc1_btn1').click(function(){ 
let inputs = 0;
$ ('#calc .calc1_input input').not("[disabled]").each (function (index) {
     let input = ($ (this).val ());
     let  data =($('#calc .calc1_input input').not("[disabled]").data("price"));
      inputs += input * data; 
});
$('#calc .calc_result p').html("Ընդհանուր Արժեքը: " + inputs + " դրամ");
});

laimas 09.01.2019 04:25

Цитата:

Сообщение от Hovik
оно выбирает для всех значение первого data, а они могут быть разними

Речь о цене в разных валютах, что ниже в коде? Цена должна быть одна и пересчитываться по курсу валюты. Если же цена за единицу товара уже просчитана сервером и отдается клиенту, то

<input type="text" data-price="[5000,6000,7000]">

цен за единицу товара, .data("price") вернет их массив, а опции списка выбора валюты значениями должны указывать на индекс в этом массиве.

рони 09.01.2019 08:24

Цитата:

Сообщение от Hovik
но скрипт работает не правильно

let data =($('#calc .calc1_input input').not("[disabled]").data("price"));
let  data = $(this).data("price");

Hovik 09.01.2019 12:39

Логика хорошая но теперь вопрос другой, оставить if + each или foreach использовать и вообще не понимаю как это сделать если можно то дайте ссылку на пример.

laimas 09.01.2019 15:53

Цитата:

Сообщение от Hovik
но теперь вопрос другой

Кому и о чем?

Hovik 09.01.2019 18:35

Вапрос к вам laimas,, ответ рони, понял, он просто написал код хата я ещё не праверил но там нужно тупа менять строк кода.
А вапрос такой. Логика вашего структуры понятно мне, по поводу работы с валютами, но каким образом сделать это, я понимаю может это для вас лехкая задача, но для меня очень трудный, голова прямо разваливается, пращу если вазможна то напишите код целиком.

Hovik 09.01.2019 18:37

https://javascript.ru/forum/jquery/7...massiva-2.html

рони 09.01.2019 18:48

Hovik,
<input type="text" data-price="[5000,6000,7000]">
 <select id='valute'> <option value="0">AMD</option>

$(function() {
$('.calc1_btn').click(function(){
let inputs = 0, index = $('#valute').val();
$ ('#calc .calc1_input input').not("[disabled]").each (function (index) {
     let input = +$(this).val();
     let  data = $(this).data('price');
     inputs += input * data[index];
     });
$('.calc_result p').html(inputs);

});
$('#valute').change(function() {
    $('.calc1_btn').trigger('click')
})
});

Hovik 10.01.2019 00:39

Ссылка на сайт не получается, смотрите сами.
http://heraxosi-aqsesuar.ru/calculation.html#valute
inputs == nan

laimas 10.01.2019 13:25

Цитата:

Сообщение от Hovik
но каким образом сделать это, я понимаю может это для вас лехкая задача

В общем она ни для кого не будет трудной, для вас в том числе. А вот как сделать, это уже зависит от того, как представлены исходные данные, именно под это представление и требуется писать код клиентский, а не подгонять под ответ.

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

Другой способ, это цена товара в базе представлена в одной базовой валюте, которая является валютой по умолчанию. Все дальнейшие операции с этой ценой с учетом валют производятся на лету. А планировщик только получает и сохраняет в базе курсы валют с которыми работает сайт. Предположим что у вас так и хранятся товары/услуги или чего-то там. Теперь можно думать какие задачи будут возложены на клиента, что соответственно и определит html структуру представления товаров/услуг на странице, и код ее обслуживающий.

Здесь два возможных варианта:

1) Клиентский код обеспечивает только выборку и сохранение в куках выбранной валюты либо передает выбранную валюты как параметр запроса в URL. Расчеты какие либо он производит согласно ценам по выбранной валюте, как это ранее и говорилось, в атрибутах data-..., в которые их помещает сервер, при выдаче страницы клиенту, рассчитывая цены в валютах отличных от базовой согласно курса. Кроме этого сервер помещает во все элементы на странице, которые отображают цену товара/услуги, рассчитанные цены в атрибут data-... То есть при смене валюты в списке, все цены на странице также должны быть выбраны из этих атрибутов и отображены у товара/услуги js-скриптом.

2) Для клиента сервер ничего не считает при запросе страниц, он отдает страницу всегда с ценами в базовой валюте, а в опции списка выбора валют помещает в data-... атрибуты отношения курсов валют. Для базовой валюты оно равно 1, для остальных соответственно курсу, а также помещает в data-... атрибуты и символы валют. Отдавая страницу клиенту, сервер также проверяет установку кук и если нет установленной валюты, устанавливает в куках базовую валюту. При получении страницы js-код проверяет какая валюта хранится в куках, отмечает в списке опцию соответствующую этой валюте, получает все цены на странице, производит их конвертацию к установленной валюте и отображает их на странице. При расчете в калькуляторе конвертирует суммы выбранных товаров/услуг и итоговую сумму. При смене валюты в списке производятся такие же операции плюс сохранение выбранной валюты в куках.

Почему куки? Если на сайте нет и не предусматривается таких операций как например выбор по фильтру по цене, то в общем-то не обязательно куки, можно хранить выбранную валюту и в локальном хранилище. Иначе сервер должен знать в какой валюте делается запрос фильтра, чтобы привести цены в запросе к базовой валюте для подстановки их в SQL запрос. А удобнее всего для этого куки - сервер имея доступ к ним определит текущую валюту.

В принципе это все, в общем плане.

Hovik 14.01.2019 11:00

Спасибо вам обоим, вы оба профессиональной праграмисти и я рад что вы памагаите новичкам. К сожалению я ещё не хорошо знаю php но учусь, так что есть надежда что до окончания года буду называться праграмистом, ну а пока решил сделать эту задачу без выбор валюты а потом увидим. Большое спасибо вам обоим.


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