12.07.2016, 12:36
|
|
Новичок на форуме
|
|
Регистрация: 12.07.2016
Сообщений: 3
|
|
Получение данных из таблицы.
Здравствуйте. Есть таблица расстояний между городами и два выпадающих списка с названиями городов. Как красиво сделать, чтобы при выборе в селектах отображалось расстояние из таблицы? Пробовал делать через "else if ", но при большом количестве городов скрипт очень большой получается))
|
|
12.07.2016, 12:49
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
alexXXL,
Сообщение от alexXXL
|
Есть таблица расстояний между городами
|
Вместо таблицы нужен массив значений. И тогда по выбранным городам искать нужное значение в массиве.
|
|
12.07.2016, 13:26
|
|
Новичок на форуме
|
|
Регистрация: 12.07.2016
Сообщений: 3
|
|
То есть сначала первым селектом мы выбираем нужную строку и создаем из нее массив, а при выборе второго - необходимое значение?
|
|
12.07.2016, 14:14
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Сообщение от alexXXL
|
и создаем из нее массив
|
создайте массив и из него выбирайте, а лучше 2 массива первый названия городов, второй растояния и оба можно в один обьект соединить.
|
|
12.07.2016, 16:28
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
А как осуществляется связь между расстоянием и двумя городами?
|
|
12.07.2016, 16:34
|
Профессор
|
|
Регистрация: 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>
|
|
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>
|
|
12.07.2016, 18:04
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Ну то есть граф не поддается. В первом случае надо собирать вручную все уникальные названия, во втором dist растет согласно декартову произведению числа уникальных названий. То есть будет там 400 городов, в дисте будет 400 * 400, или 160 000. )))
|
|
12.07.2016, 18:15
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Здесь N:N отношение, то есть таблица городов и таблица расстояний. Без sql записать можно так
var dist={
'706':['Москва','Рязань'],
'1234':['Москва','Питер'],
'765':['Москва','Казань'],
'8654':['Казань','Мухосрань'],
'10854':['Казань','Тмутаракань']
};
Теперь из этого объедка можно получить все уникальные топонимы и затем методом перебора искать совпадения.
Поэтому советую загнать барахло в БД, там будет ровно 2 таблицы с полями id и city, и таблица с полями id, city1id, city2id, dist.
|
|
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>
|
|
|
|