Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.07.2016, 12:36
Аватар для alexXXL
Новичок на форуме
Отправить личное сообщение для alexXXL Посмотреть профиль Найти все сообщения от alexXXL
 
Регистрация: 12.07.2016
Сообщений: 3

Получение данных из таблицы.
Здравствуйте. Есть таблица расстояний между городами и два выпадающих списка с названиями городов. Как красиво сделать, чтобы при выборе в селектах отображалось расстояние из таблицы? Пробовал делать через "else if ", но при большом количестве городов скрипт очень большой получается))
Ответить с цитированием
  #2 (permalink)  
Старый 12.07.2016, 12:49
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

alexXXL,
Сообщение от alexXXL
Есть таблица расстояний между городами
Вместо таблицы нужен массив значений. И тогда по выбранным городам искать нужное значение в массиве.
Ответить с цитированием
  #3 (permalink)  
Старый 12.07.2016, 13:26
Аватар для alexXXL
Новичок на форуме
Отправить личное сообщение для alexXXL Посмотреть профиль Найти все сообщения от alexXXL
 
Регистрация: 12.07.2016
Сообщений: 3

То есть сначала первым селектом мы выбираем нужную строку и создаем из нее массив, а при выборе второго - необходимое значение?
Ответить с цитированием
  #4 (permalink)  
Старый 12.07.2016, 14:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Сообщение от alexXXL
и создаем из нее массив
создайте массив и из него выбирайте, а лучше 2 массива первый названия городов, второй растояния и оба можно в один обьект соединить.
Ответить с цитированием
  #5 (permalink)  
Старый 12.07.2016, 16:28
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

А как осуществляется связь между расстоянием и двумя городами?
Ответить с цитированием
  #6 (permalink)  
Старый 12.07.2016, 16:34
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

alexXXL,
<!DOCTYPE html>
<html>
<head>
    <title>Distance</title>
</head>
<script>
    var distance = [{ city1: "Москва", city2: "Питер", dist: 706 },
                { city1: "Москва", city2: "Рязань", dist: 196 },
                { city1: "Москва", city2: "Казань", dist: 812 },
                { city1: "Рязань", city2: "Питер", dist: 908 },
                { city1: "Рязань", city2: "Казань", dist: 820 },
                { city1: "Питер", city2: "Казань", dist: 1518}];
 </script>
<body>

   <select id="city1">
       <option value = "Москва">Москва</option>
       <option value = "Питер">Питер</option>
       <option value = "Рязань">Рязань</option>
       <option value = "Казань">Казань</option> 
   </select>
   <select id="city2">
       <option value = "Москва">Москва</option>
       <option value = "Питер">Питер</option>
       <option value = "Рязань">Рязань</option>
       <option value = "Казань">Казань</option> 
   </select>

   <input id="dist" type="text" />
   <script>
       document.body.addEventListener("change", function (e) {
           var c1 = document.getElementById("city1").value,
               c2 = document.getElementById("city2").value,
               ds = document.getElementById("dist");
           for (var i = 0; i < distance.length; i++) {
               if ((distance[i].city1 == c1 && distance[i].city2 == c2) || (distance[i].city1 == c2 && distance[i].city2 == c1))  {
                   ds.value = distance[i].dist;
                   i = distance.length;
               } else { ds.value = 0; }
           }
       });   
   </script>
</body>
</html>
Ответить с цитированием
  #7 (permalink)  
Старый 12.07.2016, 17:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

alexXXL,
<!DOCTYPE html>
<html>
<head>
    <title>Distance</title>
    <meta charset="utf-8">
</head>

<body>

   <select class="city"></select>
   <select class="city"></select>
   <input class="dist" type="text" />
   <script>
window.addEventListener("DOMContentLoaded", function() {
    var selects = document.querySelectorAll(".city"),
        dist = document.querySelector(".dist"),
        distance = {
            city: ["Москва","Питер","Рязань","Казань"],
            dist: [
                [0, 706, 196, 812],
                [706, 0, 908, 1518],
                [196, 908, 0, 820],
                [812, 1518, 820, 0]
            ]
        };
    [].forEach.call(selects, function(select, ind) {
        distance.city.forEach(function(text, i) {
            select.options[i] = new Option(text, i)
        });
        select.addEventListener("change", function() {
            dist.value = distance.dist[select.value][selects[+!ind].value]
        })
    })
});
   </script>
</body>
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 12.07.2016, 18:04
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Ну то есть граф не поддается. В первом случае надо собирать вручную все уникальные названия, во втором dist растет согласно декартову произведению числа уникальных названий. То есть будет там 400 городов, в дисте будет 400 * 400, или 160 000. )))
Ответить с цитированием
  #9 (permalink)  
Старый 12.07.2016, 18:15
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Здесь N:N отношение, то есть таблица городов и таблица расстояний. Без sql записать можно так

var dist={
    '706':['Москва','Рязань'],
    '1234':['Москва','Питер'],
    '765':['Москва','Казань'],
    '8654':['Казань','Мухосрань'],
    '10854':['Казань','Тмутаракань']
};


Теперь из этого объедка можно получить все уникальные топонимы и затем методом перебора искать совпадения.

Поэтому советую загнать барахло в БД, там будет ровно 2 таблицы с полями id и city, и таблица с полями id, city1id, city2id, dist.
Ответить с цитированием
  #10 (permalink)  
Старый 12.07.2016, 19:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

warren buffet,
самое оптимальное для таких случаев ... 400 городов 79800 вариантов ... для 4 городов 6 вариантов растояний ... количество линий на рисунке ... код ниже.
<!DOCTYPE html>
<html>
<head>
    <title>Distance</title>
    <meta charset="utf-8">
</head>

<body>

   <select class="city"></select>
   <select class="city"></select>
   <input class="dist" type="text" />
   <script>
window.addEventListener("DOMContentLoaded", function() {
    var selects = document.querySelectorAll(".city"),
        dist = document.querySelector(".dist"),
        distance = {
            city: ["Москва","Питер","Рязань","Казань"],
            dist: [
                [706, 196, 812],
                [908, 1518],
                [820]
            ]
        };
    [].forEach.call(selects, function(select, ind) {
        distance.city.forEach(function(text, i) {
            select.options[i] = new Option(text, i)
        });
        select.addEventListener("change", function() {
            var a = selects[0].value, b = selects[1].value, d = distance.dist, val;
            val = d[a] && d[a][b - a - 1]||d[b] && d[b][a  - b - 1]||0
            dist.value = val
        })
    })
});
   </script>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка и получение данных AJAX Le7o AJAX и COMET 18 14.06.2016 21:55
Получение данных из строки таблицы idShura AJAX и COMET 3 30.05.2014 16:39
Через ajax отправить много данных из таблицы на сервер Heger jQuery 3 29.08.2012 18:51
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Изменение окраски строк таблицы, исходя из данных? Space-06 Events/DOM/Window 4 14.02.2012 21:32