我正在制作一个简单的程序,确定下一班火车的时间。我有一个包含所有列车时间的阵列,我只是不知道如何确定哪个是最接近当前时间的,而不是过去。以下是我到目前为止的情况:
var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
function nextTrain(time) {
}
在函数nextTrain()
中,我应该只使用if-else语句,还是有更好的方法?
答案 0 :(得分:5)
由于trainTimes数组是有序的,你可以遍历它们,直到你找到当前时间之后的第一个,然后中断。
function nextTrain(time) {
for (i = 0; i<trainTimes.length; i++){
if(trainTimes[i]>time){
console.log("the next train is " + trainTimes[i]);
break;
}
}
}
答案 1 :(得分:2)
var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
// given sorted array.
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
// returns nth train
function nextTrain(num, arr) {
n = 0
while (arr[n] <= num){ // consider < vs. <=
n++;
}
return arr[n];
}
console.log(nextTrain(time,trainTimes))
来自link
的想法答案 2 :(得分:0)
我建议你在这里进行二进制搜索,因为你的数组已经排序了。您可以查看此link以获取有关实施的详细信息。
在弄清楚当前时间落在数组中的位置后,您可以计算当前时间与两个最近邻居的差异。这取决于当前时间在二叉树中的位置。无论如何,这种方法效率很高。
答案 3 :(得分:0)
你需要将你的小时数乘以100。
然后你可以尝试这样的事情:
nextTrain(time);
function nextTrain(time) {
var timeFound = false;
for(var i = 0; i < trainTimes.length; i++){
if(time > trainTimes[i - 1] && time < trainTimes[i] && !timeFound ){
console.log("Next train time is: " + trainTimes[i]);
timeFound=true;
}
}
}
答案 4 :(得分:0)
我希望它可以帮助你
var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
var diff = new Array(12);
for (i = 0; i < trainTimes.length; i++) {
diff[i] =Math.abs( time + trainTimes[i]);//difference
}
var diff_sort = diff.sort(function(a, b){return a-b});//acs sort
var nearestIndex = diff.indexOf(diff_sort[0]);
var nearestValue = trainTimes[nearestIndex];
alert(nearestValue)
答案 5 :(得分:0)
请使用:
var nextTimeIndex = (trainsTimes.indexOf(time) >= trainsTimes.length) ? 0 : trainsTimes.indexOf(time) + 1;
var nextTrain = trainsTimes[nextTimeIndex];