javascript - 如何正确使用数组来解决我的问题? Javascript

标签 javascript html arrays

我无法弄清楚如何正确使用我制作的距离数组。我正在创建一个简单的网络应用程序,用户将在其中选择他们的出发地和首选目的地,我需要计算 ETA。我已经可以计算 ETA,但是代码太长了,所以我想知道是否有更好的方法来做到这一点。 例如: 1) 在选择选项中,我有 4 个位置,分别是马尼拉、QC、马卡蒂和马里基纳。 2) 如果用户选择马尼拉作为起点,QC 作为目的地,我可以仅使用 if-else 来计算它,但如果我考虑所有可能的方式,我的代码将因 if-else 语句而变长。

顺便说一句,这只是选择选项的示例数据,真实数据包含 24 个位置和目的地。所以我真的希望我能有一个简单的方法来做到这一点。

我只尝试了 if-else 语句,我在想也许我只是循环它,但我不知道如何开始。 请参阅代码以供引用。谢谢!

console.clear()
function validateSelect(e) {
  var origin = e.target.querySelector("[name=origin]").value;
  var destination = e.target.querySelector("[name=destination]").value;
  if (origin == destination) {
    e.stopPropagation()
    e.preventDefault()
    alert("Origin and Destination can't be the same");
    return false;
  }
}

var distanceArray = [10000,20000,30000];
//manila to qc 10000 meter
//qc to makati 20000 meter
//makati to marikina 30000 meter
document.getElementById('findEta').addEventListener('submit', validateSelect);//for form find eta
function getEta(){
    var selectedOrigin = document.getElementById("origin").selectedIndex;
    var selectedDestination = document.getElementById("destination").selectedIndex;
    var estimatedTimeOfArrival = document.getElementById("estimatedTimeOfArrival");


  if((selectedOrigin ==  0)&& (selectedDestination == 1)){
        //manila to qc
        distance = 10000;
        var speed = 5.56; //converted speed from 20km/h
        time = distance/speed; 
        eta = Math.floor(time).toString();
        if((eta >=60)){
            var newEta = eta /60; //minutes
            var mod = eta%60; //seconds
            newEta = Math.floor(newEta);
            estimatedTimeOfArrival.value = newEta + "m "+mod+"s" ;
        }else{
            eta.toString();
            estimatedTimeOfArrival.value = eta + " s";
        }
    }else if((selectedOrigin ==  0)&& (selectedDestination == 2)){

        distance = 20000;
        var speed = 5.56;
        time = distance/speed; 
        eta = Math.floor(time).toString();
        if((eta >=60)){
            var newEta = eta /60; //minutes
            var mod = eta%60; //seconds
            newEta = Math.floor(newEta);
            estimatedTimeOfArrival.value = newEta + "m "+mod+"s" ;
        }else{
            eta.toString();
            estimatedTimeOfArrival.value = eta + " s";
        }
    }else if((selectedOrigin ==  0)&& (selectedDestination == 2)){
        distance = 30000;

        var speed = 5.56;
        time = distance/speed; 
        eta = Math.floor(time).toString();
        if((eta >=60)){
            var newEta = eta /60; //minutes
            var mod = eta%60; //seconds
            newEta = Math.floor(newEta);
            estimatedTimeOfArrival.value = newEta + "m "+mod+"s" ;
        }else{
            eta.toString();
            estimatedTimeOfArrival.value = eta + " s";
        }
    }
}
function alertFunction(){
    var selectedOrigin = document.getElementById("origin").value;
    var selectedDestination = document.getElementById("destination").value;
    var estimatedTimeOfArrival = document.getElementById("estimatedTimeOfArrival");
if((selectedOrigin == "")&&(selectedDestination =="")){
    alert("Please select an option first.");
}else if(selectedOrigin == selectedDestination){
    validateSelect(e);
}
else{
    getEta();
    alert("\nYour Origin is: "+selectedOrigin+"\nYour Destination is: "+selectedDestination+"\nYour ETA is: "+estimatedTimeOfArrival.value);
}
    
}
<form action="" id="findEta">
        <select name="origin" id="origin">
            <option value="manila">manila</option>
            <option value="QC">QC</option>
            <option value="makati">Makati</option>
            <option value="marikina">marikina</option>
        </select>
        <select name="destination" id="destination">
            <option value="manila">manila</option>
            <option value="QC">QC</option>
            <option value="makati">Makati</option>
            <option value="marikina">marikina</option>
        </select>
        <input type="hidden" name="estimatedTimeOfArrival"id="estimatedTimeOfArrival">
        <button type="submit" value="submit" onclick="alertFunction()">submit</button>
    </form>

最佳答案

我们可以排除从 A 点到 A 点的行程(0 距离),我们可以假设从 A 点到 B 点的行程与反向行程的距离相同。有了这个,将位置表示为单个字母(a、b、c、d),距离矩阵可以像这样紧凑地描述......(具有虚构的距离值)

let distances = {
  ab: 1000,
  ac: 2000,
  ad: 3000,
  bc: 1500,
  bd: 2500,
  cd: 1200
}

function distance(from, to) {
  let key = [from, to].sort().join('')
  return distances[key]
}

console.log(distance('d', 'a'))
console.log(distance('b', 'c'))

关于javascript - 如何正确使用数组来解决我的问题? Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56122844/

相关文章:

javascript - 在 fullCalendar 中更改 slotDuration 而无需重新加载页面

javascript - jQuery Accordion - 无法关闭当前 <dt>

javascript - 将本地 javascript 插入 iframe html

c++ - C++ 中的全局字符串数组

java - 座位定位器 - 3D 数组 (Java)

javascript - 缺少 ASP.NET 验证器

javascript - 在没有 jquery 的评级星中表示来自 json 文件的数据!!纯JavaScript

jquery - 如何确保我的下拉菜单重叠并覆盖页面上的所有内容?

html - 如何设置除选项之外的选择框文本的样式

c++ - 无法将 CString 转换为 BYTE 数组